Machine Learning for Building a Food Recommendation System

Many factors influence individual’s health, such as physical exercise, sleep, nutrition, heredity and pollution. Being nutrition one of the biggest modifiable factors in our lives, small changes can have a big impact. With the exponential increase in the number of available food options, it is not possible to take them all into account anymore. The only way to consider user taste preferences, maximize the number of healthy compounds and minimize the unhealthy ones in food, is using (3D) recommendation systems.

The goal of this project was to use the largest publicly available collection of recipe data (Recipe1M+) to build a recommendation system for ingredients and recipes. Train, evaluate and test a model able to predict cuisines from sets of ingredients. Estimate the probability of negative recipe-drug interactions based on the predicted cuisine. Finally, to build a web application as a step forward in building a 3D recommendation system.

A vectorial representation for every ingredient and recipe was generated using Word2Vec. An SVC model was trained to return recipes’ cuisines from their set of ingredients. South Asian, East Asian and North American cuisines were predicted with more than 73% accuracy. African, Southern European and Middle East cuisines contain the highest number of cancer-beating molecules. Finally, it was developed a web application able to predict the ingredients from an image, suggest new combinations and retrieve the cuisine the recipe belongs, along with a score for the expected number of negative interactions with antineoplastic drugs (github.com/warcraft12321/HyperFoods).

Importing Modules

Importing libraries installed using PyPI and functions present in scripts created in for this project.

In [1]:
# ---------------------------- Data Management ----------------------------
# pandas is an open source library providing high-performance, easy-to-use data structures and data 
# analysis tools for the Python programming language.

import pandas

# ---------------------------- Scientific Operations ----------------------------
# NumPy is the fundamental package for scientific computing with Python. It contains among other things: a powerful 
# N-dimensional array object, sophisticated (broadcasting) functions, tools for integrating C/C++ and Fortran code, 
# useful linear algebra, Fourier transform, and random number capabilities.

import numpy

# ---------------------------- Write & Read JSON Files ----------------------------
# Python has a built-in package which can be used to work with JSON data.

import json

# ---------------------------- Pickling ----------------------------
# The pickle module implements binary protocols for serializing and de-serializing a Python object structure. “Pickling”
# is the process whereby a Python object hierarchy is converted into a byte stream, and “unpickling” is the inverse 
# operation, whereby a byte stream (from a binary file or bytes-like object) is converted back into an object hierarchy.

import pickle

# ------------------------------------- Word2Vec -------------------------------------
# Word2Vec is a group of related models that are used to produce word embeddings. These models are shallow, two-layer neural
# networks that are trained to reconstruct linguistic contexts of words. Word2vec takes as its input a large corpus of
# text and produces a vector space, typically of several hundred dimensions, with each unique word in the corpus being
# assigned a corresponding vector in the space. Word vectors are positioned in the vector space such that words that
# share common contexts in the corpus are located close to one another in the space.
# Gensim is a Python library for topic modelling, document indexing and similarity retrieval with large corpora. Target
# audience is the natural language processing (NLP) and information retrieval (IR) community.

from gensim.models import Word2Vec
from gensim.models.keyedvectors import KeyedVectors

# -------------------------- Dimensionality Reduction Tools --------------------------
# Scikit-learn (also known as sklearn) is a free software machine learning library for the
# Python programming language.It features various classification, regression and clustering algorithms including 
# support vector machines, random forests, gradient boosting, k-means and DBSCAN, and is designed to interoperate with
# the Python numerical and scientific libraries NumPy and SciPy.
# Principal component analysis (PCA) - Linear dimensionality reduction using Singular Value Decomposition of the data to
# project it to a lower dimensional space. The input data is centered but not scaled for each feature before applying 
# the SVD.
# t-distributed Stochastic Neighbor Embedding (t-SNE) - It is a tool to visualize high-dimensional data. It converts 
# similarities between data points to joint probabilities and tries to minimize the Kullback-Leibler divergence between
# the joint probabilities of the low-dimensional embedding and the high-dimensional data. t-SNE has a cost function that
# is not convex, i.e. with different initializations we can get different results.

from sklearn.decomposition import PCA
from sklearn.manifold import TSNE

# ------------------------------ Check File Existance -------------------------------
# The main purpose of the OS module is to interact with the operating system. Its primary use consists in 
# creating folders, removing folders, moving folders, and sometimes changing the working directory.

from os import path

# ------------------------ Designed Visualization Functions -------------------------
# Matplotlib is a Python 2D plotting library which produces publication quality figures in a variety of hardcopy formats
# and interactive environments across platforms. Matplotlib can be used in Python scripts, the Python and IPython
# shells, the Jupyter notebook, web application servers, and four graphical user interface toolkits.
# Plotly's Python graphing library makes interactive, publication-quality graphs. You can use it to make line plots, 
# scatter plots, area charts, bar charts, error bars, box plots, histograms, heatmaps, subplots, multiple-axes, polar 
# charts, and bubble charts.
# Seaborn is a Python data visualization library based on matplotlib. It provides a high-level interface for drawing
# attractive and informative statistical graphics.

from algorithms.view.matplotlib_designed import matplotlib_function
from algorithms.view.plotly_designed import plotly_function
from algorithms.view.seaborn_designed import seaborn_function

import matplotlib.pyplot as pyplot
import matplotlib as mpl
import matplotlib.cm as cm

import seaborn

# ------------------------ Retrieving Ingredients, Units and Quantities -------------------------

from algorithms.parsing.ingredient_quantities import ingredient_quantities
from algorithms.parsing.ingredient_quantities_Copy11 import ingredient_quantities

# ------------------------ Correcting Recipe1M+ Dataset -------------------------

from algorithms.fractions.correct_fractions_recipe1M import corrector

# ------------------------ Creating Vocabulary Units -------------------------

from algorithms.vocabulary.units import create_unit_vocab

# ------------------------ Create Distance Matrix -------------------------
# SciPy is a free and open-source Python library used for scientific and technical computing. SciPy contains modules for
# optimization, linear algebra, integration, interpolation, special functions, FFT, signal and image processing, ODE
# solvers and other tasks common in science and engineering.
# distance_matrix returns the matrix of all pair-wise distances.

from scipy.spatial import distance_matrix

# ------------------------ Unsupervised Learning -------------------------
#

from clustering.infomapAlgorithm import infomap_function # Infomap algorithm detects communities in large networks with the map equation framework.
from sklearn.cluster import DBSCAN, MeanShift # DBSCAN, Meanshift
import community # Louvain
from sklearn.cluster import SpectralClustering

# ------------------------ Supervised Learning -------------------------
# GridSearchCV to choose the right tuning parameters. confusion_matrix used to evaluate the model.

from sklearn.model_selection import train_test_split, cross_val_score, KFold, StratifiedKFold, LeaveOneOut
from sklearn.svm import LinearSVC
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import confusion_matrix

# ------------------------ Jupyter Notebook Widgets -------------------------
# Interactive HTML widgets for Jupyter notebooks and the IPython kernel.

import ipywidgets as w
from IPython.core.display import display
from IPython.display import Image

# ------------------------ IoU Score -------------------------
# The Jaccard index, also known as Intersection over Union and the Jaccard similarity coefficient (originally given the
# French name coefficient de communauté by Paul Jaccard), is a statistic used for gauging the similarity and diversity 
# of sample sets. The Jaccard coefficient measures similarity between finite sample sets, and is defined as the size of 
# the intersection divided by the size of the union of the sample sets.
# Function implemented during this project.

from benchmark.iou_designed import iou_function

# ------------------------ F1 Score -------------------------
# The F1 score can be interpreted as a weighted average of the precision and recall, where an F1 score reaches its best
# value at 1 and worst score at 0. The relative contribution of precision and recall to the F1 score are equal. The 
# formula for the F1 score is: F1 = 2 * (precision * recall) / (precision + recall)

from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.metrics import f1_score

# ------------------------ API Requests -------------------------
# The requests library is the de facto standard for making HTTP requests in Python. It abstracts the complexities of
# making requests behind a beautiful, simple API so that you can focus on interacting with services and consuming data 
# in your application.

import requests

# ------------------------ RegEx -------------------------
# A RegEx, or Regular Expression, is a sequence of characters that forms a search pattern.
# RegEx can be used to check if a string contains the specified search pattern.
# Python has a built-in package called re, which can be used to work with Regular Expressions.

import re

# ------------------------ Inflect -------------------------
# Correctly generate plurals, singular nouns, ordinals, indefinite articles; convert numbers to words.

import inflect

# ------------------------ Parse URLs -------------------------
# This module defines a standard interface to break Uniform Resource Locator (URL) strings up in components (addressing
# scheme, network location, path etc.), to combine the components back into a URL string, and to convert a “relative URL”
# to an absolute URL given a “base URL.”

from urllib.parse import urlparse

# ------------------------ Embedding HTML -------------------------
# Public API for display tools in IPython.

from IPython.display import HTML

# ------------------------ Creating Graph -------------------------
# NetworkX is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of 
# complex networks.

import networkx

# ------------------------ Language Detectors -------------------------
# TextBlob requires API connnection to Google translating tool (low limit on the number of requests). langdetect is an offline detector.

from textblob import TextBlob
from langdetect import detect

# ------------------------ Language Detectors -------------------------
# In Python, string.punctuation will give the all sets of punctuation: !"#$%&'()*+, -./:;<=>?@[\]^_`{|}~

import string

# ------------------------ CSV Reader -------------------------
# CSV (Comma Separated Values) format is the most common import and export format for spreadsheets and databases.

import csv

# ------------------------ Natural Language Processing -------------------------
# NLTK is a leading platform for building Python programs to work with human language data. It provides easy-to-use interfaces to
# over 50 corpora and lexical resources such as WordNet, along with a suite of text processing libraries for classification, 
# tokenization, stemming, tagging, parsing, semantic reasoning and wrappers for industrial-strength NLP libraries.
# stopwords returns all the stopwords present in the english language (e.g.: and, to, for...). 
# wordnet allows the user to test if a word belongs to the class of verbs, nouns, adjectives (...).
# WordNetLemmatizer lemmatizes a given word by transforming it in a more fundamental version of itself (e.g.: better -> good or nouns -> noun).
# word_tokenize tokenizes a string provided as input. It separates different words, as well as punctuation from them.
# webcolors returns a set of the most used color names.

from nltk.corpus import stopwords, wordnet
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
import webcolors

# ------------------------ Parallel Code Execution -------------------------
# joblib provides a simple helper class to write parallel for loops using multiprocessing. 
# multiprocessing detects the number of cores in the executing machine.

from joblib import Parallel, delayed
import multiprocessing

# ------------------------ Others -------------------------

import math
import ast
import random

%load_ext autoreload

Importing Datasets

Recipe1M+

Importing

In [2]:
%%time

# This was the chosen dataset to perform all data analysis.

# After testing different python modules (json and simplejson) to load Recipe1M+ JSON file, it was concluded they present similar performances.
# ---------------------------- Importing Recipe1M+ Dataset ----------------------------

f_recipe1M = open('./data/recipe1M+/noEmptyIngredientsOrInstructions/noEmptyIngredientOrInstructionRecipes/fractionsCorrected/fractionsCorrected.json')
recipes_data = (json.load(f_recipe1M))#[0:100000] # Regular computer able to read Recipe1M+ full dataset.
f_recipe1M.close()

id_ingredients = {}
id_url = {}
id_tea = {}
id_salad = {}

lemmatizer = WordNetLemmatizer()

for recipe in recipes_data:

    id_ingredients[recipe["id"]] = []
    id_url[recipe["id"]] = recipe["url"]
    
    title_tokenized_lemmatized = word_tokenize(recipe["title"])
    
    title_tokenized_lemmatized = [lemmatizer.lemmatize(w.lower()) for w in title_tokenized_lemmatized]
    
    if "tea" in title_tokenized_lemmatized:
        
        id_tea[recipe["id"]] = recipe["title"]
        
    if "salad" in title_tokenized_lemmatized:
        
        id_salad[recipe["id"]] = recipe["title"]

    for index, ingredient in enumerate(recipe["ingredients"]):
        
        id_ingredients[recipe["id"]].append({"id": index, "ingredient": (ingredient["text"]).lower()})
        
print(list(id_tea.keys())[0:20])
print(list(id_tea.values())[0:20])
['000075604a', '001ba4a971', '0024561022', '00359b9827', '003cc8f5b7', '005a7aa8db', '006d7af895', '006eb2fcf7', '007935bc94', '008a8e3e45', '00a1c883d4', '00a73825dc', '00bc0ed876', '00d70d2696', '00e23fb1d2', '00e4b37f84', '0100408791', '011aafaec9', '012495edff', '012bd57700']
['Kombu Tea Grilled Chicken Thigh', 'Tea Braised Hanger Steak with Root Vegetables', 'Iced Green Tea Frappe', 'Spice Tea (Or Russian Tea)', 'Tickled Pink Tropical Island "iced Tea"', 'Greek Clove Tea Cakes', "Momma's never get sick again tea", 'Tea Biscuits or Pot Pie Top Crust', 'Tea Scones', 'Blackberry Sweet Tea', 'Carrot Tea Bread', 'Hazelnut Tea Cake with Moscato Pears', 'Green Tea Layer Cake W/Green Tea Frosting', 'Tokyo Tea', 'Apricot Lavender Brown Butter Tea Cakes', 'Butterscotch Pecan Tea Bread', "Monika's Black Tea and Date Bread", "My Grandmother's Fat Free English Tea Loaf - Bread", 'Homemade Bubble Tea', 'Coconut Ice Tea']
CPU times: user 2min 48s, sys: 12.1 s, total: 3min
Wall time: 3min 2s

Listing URLs

In [5]:
# Online websites parsed to retrieve recipes.

if not path.exists("./data/Recipe1M+/allRecipeDatabases.txt"):

    recipe_databases = []

    for key, value in id_url.items():

        parsed_uri = urlparse(value)
        result = '{uri.scheme}://{uri.netloc}'.format(uri=parsed_uri)

        recipe_databases.append(result)

    recipe_databases_list = list(set(recipe_databases)) # The common approach to get a unique collection of items is to use a set. Sets are 
    # unordered collections of distinct objects. To create a set from any iterable, you can simply pass it to the built-in
    # set() function. If you later need a real list again, you can similarly pass the set to the list() function.
    
else:
    
    recipe_databases_list = []
    f_urls = open("./data/Recipe1M+/allRecipeDatabases.txt", "r")
    for x in f_urls:
        recipe_databases_list.append(x.replace("\n", ""))

    f_urls.close()
    print(recipe_databases_list)
['http://www.foodrepublic.com', 'http://allrecipes.com', 'http://www.food.com', 'http://www.landolakes.com', 'http://www.foodnetwork.com', 'http://www.kraftrecipes.com', 'http://cookeatshare.com', 'http://www.delish.com', 'http://www.myrecipes.com', 'https://recipeland.com', 'https://cookpad.com', 'http://www.epicurious.com', 'http://cooking.nytimes.com', 'http://www.vegetariantimes.com', 'http://www.comidakraft.com', 'http://www.foodgeeks.com', 'http://www.chowhound.com', 'http://www.lovefood.com', 'http://online-cookbook.com', 'http://www.cookstr.com', 'http://www.foodandwine.com', 'http://tastykitchen.com']
In [ ]:
with open('./data/recipe1M+/allRecipeDatabases.txt', 'w') as f:
    for key, item in enumerate(recipe_databases_list):
        if item != "" and key < len(recipe_databases_list) - 1:
            f.write("%s\n" % item)
            
        elif item != "":
            f.write("%s" % item)

Kaggle&Nature

Importing

In [3]:
# Dataset used to train Support Vector Classifier. It contains set of ingredients and the associated cuisine for each recipe.

f_kaggleNature = open('./data/kaggle_and_nature/kaggle_and_nature.csv', newline = '')    
game_reader = csv.reader(f_kaggleNature, delimiter='\t')

id_ingredients_cuisine = []
cuisines = []
    
i = 0
    
for game in game_reader:
                
    id_ingredients_cuisine.append({"id": i, "ingredients": [ingredient.replace("_", " ") for ingredient in game[0].split(",")[1:]], "cuisine": game[0].split(",")[0]})
    cuisines.append(game[0].split(",")[0])
        
    i = i + 1

Optimizing

In [4]:
# Removing Ponctuation, Stopwords and Performing Lemmatization

if not path.exists("./data/kaggle_and_nature/new_id_ingredients_cuisine101010.json"):
    
    stop_words = set(stopwords.words('english'))

    intab = '''!()-[]{};:'"\,<>?@#$%^&*_~'''
    outtab = "_" * len(intab)
    trantab = str.maketrans(intab, outtab)

    lemmatizer = WordNetLemmatizer()

    new_id_ingredients_cuisine = []
    
    max_number_ingredients = 0
    
    set_ingredients = set()

    for recipe_number, recipe in enumerate(id_ingredients_cuisine):

        ingredients_aux = []

        for ingredient in recipe["ingredients"]:

            word_tokens = word_tokenize(ingredient)

            ingredient_modified = " ".join([lemmatizer.lemmatize(w.translate(trantab).replace("_", "").lower()) for w in word_tokens if w not in stop_words])

            ingredients_aux.append(ingredient_modified)
            
            set_ingredients.add(ingredient_modified)

        new_id_ingredients_cuisine.append({"id": recipe_number, "ingredients": sorted(ingredients_aux), "cuisine": recipe["cuisine"]})
        
        if max_number_ingredients < len(sorted(ingredients_aux)):
            max_number_ingredients = len(sorted(ingredients_aux))
        
else:
    
    f = open('./data/kaggle_and_nature/new_id_ingredients_cuisine.json')
    new_id_ingredients_cuisine = json.load(f)
    f.close()
In [5]:
# ---------------------------- Saving to JSON File  ----------------------------

with open('./data/kaggle_and_nature/new_id_ingredients_cuisine.json', 'w') as json_file:
    json.dump(new_id_ingredients_cuisine, json_file)

Anticancer Table

Getting the anticancer ingredients and the number of anticancer molecules each one contain. Further data processing to facilitate analysis.

Importing

In [5]:
ac_data = pandas.read_csv("./data/anticancer/food_compound_simplified.csv", delimiter = ",")
ac_data.head()

# Selecting Useful Anti-Cancer Ingredients Columns

ac_data_mod = ac_data[['Common Name', 'Number of CBMs']]
ac_data_mod

#  Dropping Nan Rows from Anti-Cancer Ingredients Table

ac_data_mod.replace("", numpy.nan)
ac_data_mod = ac_data_mod.dropna()
ac_data_mod

# Converting DataFrame to Dictionary

ingredient_anticancer = {}

for index, row in ac_data_mod.iterrows():
    
    ingredient_anticancer[row['Common Name'].lower()] = row['Number of CBMs']

Vocabularies (Recipe1M+)

Ingredients

Importing

In [6]:
ingredients_list = []

with open('./vocabulary/ingredients_vocabulary/ingr_vocab.pkl', 'rb') as f: # Includes every ingredient present in the dataset.
    ingredients_list = pickle.load(f)

new_ingredients_list = [] # List of ingredients from the vocabulary with spaces instead of underscores.

for ingredient_vocab in ingredients_list:

    if "_" in ingredient_vocab:
        new_ingredients_list.append(ingredient_vocab.replace("_", " "))
        continue

    new_ingredients_list.append(ingredient_vocab) # In case there is no _

Optimizing

In [7]:
# ---------------------------- Optimizing Ingredients Vocabulary ----------------------------

if not path.exists("./vocabulary/ingredients_vocabulary/ingr_vocab_lemmatized_stopwords.txt"):

    stop_words = set(stopwords.words('english'))

    intab = '''!()-[]{};:'"\,<>?@#$%^&*_~'''
    outtab = "_" * len(intab)
    trantab = str.maketrans(intab, outtab)

    lemmatizer = WordNetLemmatizer()

    modified_ingredient_mediumSize = []

    for key, value in enumerate(new_ingredients_list):

        word_tokens = word_tokenize(value)

        modified_ingredient_mediumSize.append(" ".join([lemmatizer.lemmatize(w.translate(trantab).replace("_", "").lower()) for w in word_tokens if w not in stop_words]))
        
else:
        
    # After some manual adjustments.

    new_ingredients_list = []
    f_ingredients = open("./vocabulary/ingredients_vocabulary/ingr_vocab_lemmatized_stopwords.txt", "r")
    for x in f_ingredients:
        new_ingredients_list.append(x.replace("\n", ""))

    f_ingredients.close()
In [ ]:
with open('./vocabulary/ingredients_vocabulary/ingr_vocab_lemmatized_stopwords.txt', 'w') as f:
    for key, item in enumerate(modified_ingredient_mediumSize):
        if item != "" and key < len(modified_ingredient_mediumSize) - 1:
            f.write("%s\n" % item)
            
        elif item != "":
            f.write("%s" % item)

Units

Importing

In [ ]:
create_unit_vocab(recipes_data, new_ingredients_list)

Optimizing

In [6]:
# ---------------------------- Optimizing Units Vocabulary ----------------------------

if not path.exists("./vocabulary/units_vocabulary/units_list_lemmatized_stopwords.txt"):

    units_list = []
    f_units = open("./vocabulary/units_vocabulary/units_list_final_filtered_lemmatized.txt", "r")

    for x in f_units:
        units_list.append(x.replace("\n", ""))

    f.close()

    new_units_list = []

    for key, value in enumerate(units_list):

        new_units_list.append(" ".join([lemmatizer.lemmatize(w.translate(trantab).replace("_", "").lower()) for w in value.split(" ") if w not in stop_words]))
        
else:
    
    new_units_list = []
    f_units = open("./vocabulary/units_vocabulary/units_list_lemmatized_stopwords.txt", "r")

    for x in f_units:
        new_units_list.append(x.replace("\n", ""))
In [ ]:
with open('./vocabulary/units_vocabulary/units_list_lemmatized_stopwords.txt', 'w') as f:
    for key, item in enumerate(modified_unit_mediumSize):
        if item != "" and key < len(modified_unit_mediumSize) - 1:
            f.write("%s\n" % item)
            
        elif item != "":
            f.write("%s" % item)

Recipe1M+

Correcting

In [ ]:
# Optimized to Recipe1M+.

corrector(recipes_data, new_ingredients_list)

Retrieving Ingredients, Units and Quantities

In [ ]:
%%time

ingredients_vocab = []
units_vocab = []

f = open("./vocabulary/ingredients_vocabulary/ingr_vocab_lemmatized_stopwords.txt", "r")

for x in f:
    ingredients_vocab.append(x.replace("\n", ""))

f.close()

def order(e):
    return len(e)

f = open('./vocabulary/units_vocabulary/units_list_lemmatized_stopwords.txt', "r")

for x in f:
    units_vocab.append(x.replace("\n", ""))
    
f.close()

print(ingredient_quantities("1/2 teaspoon rose petal", ingredients_vocab, units_vocab))

'''
def auxx11 (recipe):
    
    for ingredient in recipe["ingredients"]:
        print(ingredient_quantities(ingredient["text"], ingredients_vocab, units_vocab))
                        
    return ingredient_quantities(ingredient["text"], ingredients_vocab, units_vocab)

num_cores = multiprocessing.cpu_count()

out_output = Parallel(n_jobs=num_cores)(delayed(auxx11)(recipe) for recipe in recipes_data) # [0:100000]
'''

Ingredients

Preprocessing (Word2Vec)

In [8]:
if not path.exists("./id_listIngredients.json"):

    f = open('./id_quantities_units_ingredients_grams.json')
    id_quantities_units_ingredients_grams = (json.load(f)) # [0:100]
    f.close()

    id_listIngredients = {}
    
    max_number_ingredients = 0

    for recipe_id, recipe in id_quantities_units_ingredients_grams.items():

        id_listIngredients[recipe_id] = []

        for ingredients in recipe:

            for ingredient in ingredients:

                id_listIngredients[recipe_id].append(ingredient["ingredient"])

        id_listIngredients[recipe_id] = sorted(set(id_listIngredients[recipe_id]))
        
        if max_number_ingredients < len(id_listIngredients[recipe_id]):
            max_number_ingredients = len(id_listIngredients[recipe_id])
    
else:
    
    f = open('./id_listIngredients.json')
    id_listIngredients = (json.load(f)) # [0:100]
    f.close()
In [15]:
with open('./id_listIngredients.json', 'w') as json_file:
    
    json.dump(id_listIngredients, json_file)

Vectorization (Word2Vec)

In [9]:
if not path.exists("./trained_models/word2vec.bin"):
    
    f = open('./data/kaggle_and_nature/new_id_ingredients_cuisine.json')
    new_id_ingredients_cuisine = (json.load(f)) # [0:100]
    f.close()
        
    # ---------------------------- Recipe1M+ Dataset ----------------------------

    corpus1 = list(id_listIngredients.values())

    # ---------------------------- Kaggle&Nature Dataset ----------------------------

    corpus2 = []
    
    for key, recipe in enumerate(new_id_ingredients_cuisine):
        
        corpus2.append(recipe["ingredients"])
        
    # ---------------------------- Generating Word2Vec Model ----------------------------
        
    model = Word2Vec(corpus1 + corpus2, min_count = 1, size = 100, workers = 8, window = 65, sg = 0)

    # By default, the model is saved in a binary format to save space.
    model.save("word2vec.model")

    # Save the learned model in ASCII format and review the contents
    model.wv.save_word2vec_format('./trained_models/word2vec.txt', binary=False)

else:
    
    model = Word2Vec.load("word2vec.model")

Dimensions Reduction

PCA and T-SNE intended to decrease the dimensionality (50) of the vectors representing ingredients, so that they can be plotted in visualizable way.

In [10]:
# X_ingredients_recipe1MKaggle = model[model.wv.vocab] 
X_ingredients_recipe1M = [model[w] for w in model.wv.vocab if w in new_ingredients_list] # Not including Kaggle&Nature ingredient vectors.
X_ingredients_recipe1M_keys = [w for w in model.wv.vocab if w in new_ingredients_list] # Not including Kaggle&Nature ingredient vocabularies.

# ---------------------------- PCA ----------------------------
X_ingredients_embedded1 = PCA(n_components=2).fit_transform(X_ingredients_recipe1M)

# ---------------------------- T-SNE ----------------------------
X_ingredients_embedded2 = TSNE(n_components=2).fit_transform(X_ingredients_recipe1M)
/Users/luisrita/PycharmProjects/HyperFoods/venv/lib/python3.6/site-packages/ipykernel_launcher.py:2: DeprecationWarning:

Call to deprecated `__getitem__` (Method will be removed in 4.0.0, use self.wv.__getitem__() instead).

Clustering

Finding groups of ingredients that most often co-occur in the same recipes.

In [11]:
# ---------------------------- Build Distance Dataframe & Networkx Graph 

data = X_ingredients_embedded1 # list(X_ingredients_embedded1) / model[model.wv.vocab]
ctys = X_ingredients_recipe1M_keys # list(model.wv.vocab)
df = pandas.DataFrame(data, index=ctys)

# distances = (pandas.DataFrame(distance_matrix(df.values, df.values), index=df.index, columns=df.index)).rdiv(1) # Creating dataframe from distance matrix between ingredient vectors.
#G = networkx.from_pandas_adjacency(distances) # Creating networkx graph from pandas dataframe.
# X = numpy.array(df.values) # Creating numpy array from pandas dataframe.

# ---------------------------- Clustering 

# Spectral Clustering

ingredientModule = SpectralClustering(n_clusters=9, assign_labels="discretize", random_state=0, n_jobs=-1).fit_predict(data)

# Mean Shift

# ingredientModule = MeanShift(n_jobs=-1, cluster_all = True).fit(X).labels_

# Density-Based Spatial Clustering of Applications with Noise (DBSCAN)

# ingredientModule = DBSCAN(eps=0.3, min_samples=2, n_jobs=-1).fit(X).labels_ # Noisy samples are given the label -1.

# Louvain

#ingredientModule = list((community.best_partition(G)).values())

# Infomap

# ingredientModule = infomap_function(distances, ctys)

Counting

Retrieving how often different ingredients are used across the recipe dataset.

In [12]:
# ------------------------------- Counting Number of Ingredient Occurences across Recipe1M+

ingredients_count = {}

for recipe_id, ingredients in id_listIngredients.items():
        
    for ingredient in ingredients:
            
        if ingredient in ingredients_count.keys():
            
            ingredients_count[ingredient] = ingredients_count[ingredient] + 1
                
        else:
                
            ingredients_count[ingredient] = 0

Nutritional Information

Retrieving nutritional information for each ingredient present in the Recipe1M+ vocabulary.
Overall recipe score will be calculated taking into account not only the number of cancer-beating molecules, but also nutritional content.
Data Source: U.S. Department of Agriculture, Agricultural Research Service. FoodData Central, 2019. fdc.nal.usda.gov.

In [ ]:
get_nutritional_content(new_ingredients_list) # new_ingredients_list should contain all the ingredients lemmatized, without punctuation and with no stop words.

Visualizing

Matplotlib
In [31]:
threshold = 2500 # Hiding under-represented ingredients in the dataset.
indeces = [index for index, size in enumerate(list(ingredients_count.values())) if size > threshold]

input1 = numpy.array([size for index, size in enumerate(X_ingredients_embedded1) if index in indeces])
input2 = numpy.array([size for index, size in enumerate(X_ingredients_embedded2) if index in indeces])
input3 = [size for index, size in enumerate(list(ingredients_count.keys())) if index in indeces]
input4 = [size for index, size in enumerate(ingredientModule) if index in indeces]
input5 = [size for index, size in enumerate(list(ingredients_count.values())) if index in indeces]

input4_anticancer = []

for ingredient in input3:
    
    i = 0
    
    for antic_molecule in list(ingredient_anticancer.keys()):
        
        i = i + 1
        
        if antic_molecule in ingredient.split(" "):
            
            input4_anticancer.append("green")
            break
            
        elif len(antic_molecule.split(" ")) > 1 and antic_molecule in ingredient:
        
            input4_anticancer.append("green")
            break
            
        elif i == len(list(ingredient_anticancer.keys())):
            
            input4_anticancer.append("black")
In [29]:
%autoreload 2

matplotlib_function(input1, input2, input3, input4_anticancer, input5, "Ingredients", True)
Plotly
In [32]:
plotly_function(input1, input2, input3, input4, input5, "false", "Ingredients")
Seaborn
In [ ]:
seaborn_function(X_ingredients_embedded1, X_ingredients_embedded2, list(ingredients_count.keys()), ingredientModule, ingredientSize)

Recipes

Vectorization

Representing recipes in their vectorized way by taking the average of the vectors of the ingredients present. Calculated so that the size of each recipe marker could be proportional to the number of ingredients present.

In [14]:
%%time

f = open('./id_quantities_units_ingredients_grams.json')
final_grams = (json.load(f))# [0:100]
f.close()

recipe_weight = {}
countingIngredients = {}

# ---------------------------- Calculating total weight for each recipe ----------------------------

for recipe_id, recipe in final_grams.items():

    recipe_weight[recipe_id] = 0

    for ingredients in recipe:

        for ingredient in ingredients:

            if ingredient["quantity"]:

                #recipe_weight[recipe_id] = recipe_weight[recipe_id] + ingredient["quantity"]
                recipe_weight[recipe_id] = recipe_weight[recipe_id] + 1

    if recipe_weight[recipe_id] == 0:
        recipe_weight[recipe_id] = 1

# ---------------------------- Weighting Contribution each Ingredient ----------------------------

recipe_vector = {}

for recipe_id, recipe in final_grams.items():

    countingIngredients[recipe_id] = 0
    recipe_vector[recipe_id] = []

    for ingredients in recipe:

        if ingredients:

            for ingredient in ingredients:

                if not isinstance(ingredient, float) and ingredient["quantity"] != 0:

                    countingIngredients[recipe_id] = float(countingIngredients[recipe_id]) + 1
                    #recipe_vector[recipe_id].append(numpy.array(model[ingredient["ingredient"]]) * (float(ingredient["quantity"])))
                    recipe_vector[recipe_id].append(numpy.array(model[ingredient["ingredient"]]) * 1)

    recipe_vector[recipe_id] = numpy.sum(numpy.array(recipe_vector[recipe_id]), 0) / recipe_weight[recipe_id]
/Users/luisrita/PycharmProjects/HyperFoods/venv/lib/python3.6/site-packages/ipykernel_launcher.py:45: DeprecationWarning:

Call to deprecated `__getitem__` (Method will be removed in 4.0.0, use self.wv.__getitem__() instead).

CPU times: user 3min 7s, sys: 12.7 s, total: 3min 19s
Wall time: 3min 28s
In [15]:
new_list = {}
new_countingIngredients = {}
i = 0

for recipe_id, listy in recipe_vector.items():
    
    if not isinstance(listy, numpy.ndarray):

        i = i + 1
        
    else:
            
        new_list[recipe_id] = listy
        new_countingIngredients[recipe_id] = countingIngredients[recipe_id]

Dimensions Reduction

PCA and T-SNE intended to decrease the dimensionality (50) of the vectors representing recipes, so that they can be plotted in visualizable way. Although some informamation was inevitably lost, a pair of the most variale components was used.

In [16]:
inputt = numpy.array(list(new_list.values())[0:10000]) # Choosing number of recipes under consideration.

print(inputt.shape)

# ---------------------------- PCA ----------------------------
X_recipes_embedded1 = PCA(n_components=2).fit_transform(inputt)

# ---------------------------- T-SNE ----------------------------
X_recipes_embedded2 = TSNE(n_components=2).fit_transform(inputt)
(10000, 100)

Clustering

Finding groups of recipes that most correspond to different types of cuisine.

In [17]:
# ---------------------------- Build Distance Dataframe & Networkx Graph ----------------------------

data = list(X_recipes_embedded1) # list(X_recipes_embedded1) / id_recipe.values()
ctys = list(new_list.keys())[0:len(data)]
df = pandas.DataFrame(data, index=ctys)

# distances = (pandas.DataFrame(distance_matrix(df.values, df.values), index=df.index, columns=df.index)).rdiv(1)
# G = networkx.from_pandas_adjacency(distances) # Creating networkx graph from pandas dataframe.
# X = numpy.array(df.values) # Creating numpy array from pandas dataframe.

# ---------------------------- Clustering ----------------------------

recipeModules = SpectralClustering(assign_labels = "discretize", random_state = 0, n_jobs = -1).fit_predict(data)

# Mean Shift

# recipeModules = MeanShift(n_jobs=-1, cluster_all = True).fit(X).labels_

# Density-Based Spatial Clustering of Applications with Noise (DBSCAN)

# recipeModules = DBSCAN(eps=0.3, min_samples=2, n_jobs=-1).fit(X).labels_ # Noisy samples are given the label -1.

# Louvain

# recipeModules = list((community.best_partition(G)).values())

# Infomap

# recipeModules = infomap_function(1./distances, ctys)

Anticancer Score

Calculating the score of each recipe taking into account the number of cancer-beating molecules.
Data Source: Veselkov, K., Gonzalez, G., Aljifri, S. et al. HyperFoods: Machine intelligent mapping of cancer-beating molecules in foods. Sci Rep 9, 9237 (2019) doi:10.1038/s41598-019-45349-y

In [20]:
if not path.exists("./recipe_cancerscore.json"):

    recipe_cancerscore = {}

    # ---------------------------- Weighting Number of Anti Cancer Molecules Present in each Recipe ----------------------------

    ingredient_anticancer_keys = list(ingredient_anticancer.keys())

    j = 0

    for recipe_id, recipe in final_grams.items():

        # if j % 10000 == 0:
            # print("hi")

        recipe_cancerscore[recipe_id] = 0

        for ingredients in recipe:

            for ingredient in ingredients:

                i = 0
                aux = True
                aux2 = False

                while i < len(ingredient_anticancer_keys):

                    if aux and ingredient["ingredient"] == ingredient_anticancer_keys[i]:

                        #recipe_cancerscore[recipe_id] = recipe_cancerscore[recipe_id] + ingredient_anticancer[ingredient_anticancer_keys[i]]*(ingredient["quantity"])/(recipe_weight[recipe_id])
                        recipe_cancerscore[recipe_id] = recipe_cancerscore[recipe_id] + ingredient_anticancer[ingredient_anticancer_keys[i]]*1/(recipe_weight[recipe_id])

                        break

                    elif aux2 and ingredient["ingredient"] in ingredient_anticancer_keys[i]:

                        #recipe_cancerscore[recipe_id] = recipe_cancerscore[recipe_id] + ingredient_anticancer[ingredient_anticancer_keys[i]]*(ingredient["quantity"])/(recipe_weight[recipe_id])
                        recipe_cancerscore[recipe_id] = recipe_cancerscore[recipe_id] + ingredient_anticancer[ingredient_anticancer_keys[i]]*1/(recipe_weight[recipe_id])

                        break

                    elif i == len(ingredient_anticancer_keys) - 1 and aux and aux2 == False:

                        i = 0
                        aux = False
                        aux2 = True

                    i = i + 1

        j = j + 1
        
else:
    
    f_kaggleNature = open('./recipes_anticancerMolecules.csv', newline = '')    
    game_reader = csv.reader(f_kaggleNature, delimiter='\t')

    recipe_cancerscore = {}
        
    for game in game_reader:
        
        if game[0].split(",")[0] != "id":
            
            recipe_cancerscore[game[0].split(",")[0]] = float(game[0].split(",")[1])

Anticancer Ordered

Printing, in a decreasing order, the recipes with a bigger number of cancer-beating molecules.

In [21]:
# ---------------------------- Removing Recipes < 3 Ingredients ----------------------------

threshold = 3

recipe_cancerscore_reduced = [{"score": recipe_cancerscore[recipe_id], "id": recipe_id} for recipe_id, number in new_countingIngredients.items() if number >= threshold]
id_url_reduced = [{"url": id_url[recipe_id], "id": recipe_id} for recipe_id, number in new_countingIngredients.items() if number >= threshold]

recipe_cancerscore_reduced_adapted = {}
id_url_reduced_adapted = {}

for value in recipe_cancerscore_reduced:
    recipe_cancerscore_reduced_adapted[value["id"]] = value["score"]
    
for value in id_url_reduced:
    id_url_reduced_adapted[value["id"]] = value["url"]

# ---------------------------- Setting Visualization Options ----------------------------

pandas.set_option('display.max_colwidth', 1000)

# ---------------------------- Creating DataFrames ----------------------------

res1 = pandas.DataFrame.from_dict(recipe_cancerscore_reduced_adapted, orient='index', columns=['Anticancer Molecules/Number Ingredients'])
res2 = pandas.DataFrame.from_dict(id_url_reduced_adapted, orient='index', columns=['Recipe URL'])

# ---------------------------- Concatenating DataFrames ----------------------------

df = pandas.concat([res1, res2], axis=1).reindex(res1.index).sort_values(by=['Anticancer Molecules/Number Ingredients'], ascending=False)#[0:30]#.head()
df[0:30]
Out[21]:
Anticancer Molecules/Number Ingredients Recipe URL
2eb042cbc3 16.988103 http://www.food.com/recipe/kombucha-coconut-oil-face-cream-515544
dc7a5d106c 16.962239 http://www.food.com/recipe/peach-raspberry-bellini-iced-tea-450338
c2e7a4914f 16.841584 http://tastykitchen.com/recipes/drinks/mexican-punch/
f03fdfbe08 16.760990 http://www.food.com/recipe/cranice-smooth-249453
b0047bf381 16.613205 http://www.delish.com/recipefinder/ice-tea-family-style-1335
fc302ca7d3 16.540541 http://www.food.com/recipe/post-waxing-cure-for-a-sensitive-skin-face-108095
d09b0dc5a2 16.175070 http://tastykitchen.com/recipes/drinks/tang-tea/
f1f0f422cc 16.137177 http://www.food.com/recipe/simple-peach-tea-166778
cf74d76ae2 16.063940 http://www.food.com/recipe/basic-sweet-tea-black-tea-318313
92ebcfd08b 15.875486 http://www.foodnetwork.com/recipes/bobby-flay/tea-latte.html
df563d5e89 15.594655 http://www.food.com/recipe/spiced-tea-and-pomegranate-frappe-479442
34ac17cc37 15.389657 https://cookpad.com/us/recipes/337190-moms-tea-punch
f799dfe3a4 15.276119 http://www.food.com/recipe/black-cherry-iced-tea-91953
dba0f7437a 15.223881 http://www.food.com/recipe/butterscotch-tea-224736
35307cae56 14.785714 http://www.food.com/recipe/mint-jelly-tea-472705
c2a1ba1123 14.782609 https://cookpad.com/us/recipes/169907-wobbly-tea-jelly
643447fe20 14.678571 http://www.kraftrecipes.com/recipes/fizzy-fun-103674.aspx
91f5a1979b 14.673077 http://www.food.com/recipe/iced-tea-with-grenadine-178833
c3d585ca0c 14.401935 http://www.food.com/recipe/lemonade-tea-126719
ee91981b9f 14.367990 http://www.food.com/recipe/mums-christmas-pudding-174397
0b7851707f 14.223847 http://www.food.com/recipe/spiced-christmas-tea-for-steeping-451847
ff8de224f0 14.209956 http://www.food.com/recipe/raw-kombucha-494708
92c5121b49 14.116279 http://www.foodnetwork.com/recipes/giada-de-laurentiis/iced-tea-with-grenadine-recipe.html
08d517e994 14.007414 http://www.food.com/recipe/swamp-tea-407091
c944118fe9 13.832669 http://www.food.com/recipe/rooibos-relaxer-456726
774eaf1cbb 13.832133 http://www.food.com/recipe/tea-grog-472698
8f0b8d9ebc 13.777346 http://www.food.com/recipe/tea-jelly-23062
0b7c6e2a2c 13.745650 http://www.food.com/recipe/peach-iced-tea-55762
57f7677745 13.583640 http://www.food.com/recipe/spiced-peach-iced-tea-142713
6017035ea9 13.536702 http://www.kraftrecipes.com/recipes/hot-ginger-lemon-soother-133422.aspx
In [ ]:
df.to_csv(r'./recipes_anticancerMolecules.csv', index=True)

Visualizing

Matplotlib

Size of each marker is proportional to the number of ingredients a given recipe contains.
Markers with a similar color group recipes that contain the higher number of common ingredients.

In [34]:
%%time

# Color Recipes According to Number Anticancer Molecules

threshold = 10

sample = list(new_countingIngredients.values())[0:10000]

#modules_anticancer = [list(recipe_cancerscore.values())[index] for index, number in enumerate(sample) if number >= threshold] # Coloring recipe nodes based on the number of anticancer molecules present.
#modules_clustering = [list(recipeModules)[index] for index, number in enumerate(sample) if number >= threshold] # Clustering recipes using 1 out of 4 unsupervised learning methods.
#modules_cuisines = [clf.predict(list(recipe_cancerscore.keys())[index]) for index, number in enumerate(sample) if number >= threshold] # 

modules_tea = []

for index, number in enumerate(sample):
    
    if number >= threshold and list(recipe_cancerscore.keys())[index] in list(id_tea.keys()):
        
        modules_tea.append("black")
        
    elif number >= threshold:
        
        modules_tea.append("orange")

input1 = numpy.array([X_recipes_embedded1[index] for index, number in enumerate(sample) if number >= threshold])
input2 = numpy.array([X_recipes_embedded2[index] for index, number in enumerate(sample) if number >= threshold])
input3 = [list(recipe_cancerscore.keys())[index] for index, number in enumerate(sample) if number >= threshold]
input5 = numpy.array([number for index, number in enumerate(sample) if number >= threshold])

norm = mpl.colors.Normalize(vmin=0, vmax=17)
cmap = cm.hot

m = cm.ScalarMappable(norm=norm, cmap=cmap)

modules_anticancer_colored = []

for number_antic_molecules in modules_anticancer:
    
    modules_anticancer_colored.append(m.to_rgba(number_antic_molecules))
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<timed exec> in <module>

NameError: name 'modules_anticancer' is not defined
In [23]:
matplotlib_function(input1, input2, input3, modules_tea, input5 , "Recipes", False)
Plotly
In [33]:
%autoreload 2
plotly_function(input1, input2, input3, modules_tea, input5, "false", "Recipes")
Seaborn
In [50]:
seaborn_function(input1, input2, input3, modules_anticancer_colored, input5)

Kaggle&Nature

Synonymous Table

In [24]:
# ---------------------------- Creating Synonymous to convert Kaggle&Nature to Recipe1M+ Ingredients ----------------------------

vocabulary = set()

for recipe in id_ingredients_cuisine:
    
    for ingredient in recipe["ingredients"]:
        
        vocabulary.add(ingredient.replace(" ", "_"))

synonymous = {}

for ingredient2 in list(vocabulary):
    
    synonymous[ingredient2] = "new"

aux = 0

for ingredient2 in list(vocabulary):

    for ingredient1 in ingredient:
        
        synonymous[ingredient2] = ingredient1
        break
            
        elif ingredient1 in ingredient2:
            
            synonymous[ingredient2] = ingredient1
            
    if synonymous[ingredient2] == "new":
        aux = aux + 1
        
new_id_ingredients_cuisine = id_ingredients_cuisine
            
for key1, recipe in enumerate(id_ingredients_cuisine):
    
    for key2, ingredient in enumerate(recipe["ingredients"]):
        
        if synonymous[id_ingredients_cuisine[key1]["ingredients"][key2].replace(" ", "_")] == "new":
            
            new_id_ingredients_cuisine[key1]["ingredients"].remove(id_ingredients_cuisine[key1]["ingredients"][key2])
            continue
        
        new_id_ingredients_cuisine[key1]["ingredients"][key2] = synonymous[id_ingredients_cuisine[key1]["ingredients"][key2].replace(" ", "_")]   
        
    if len(id_ingredients_cuisine[key1]["ingredients"]) < 2:
        new_id_ingredients_cuisine.remove(id_ingredients_cuisine[key1])
  File "<ipython-input-24-15758cedaee2>", line 26
    elif ingredient1 in ingredient2:
       ^
SyntaxError: invalid syntax
In [ ]:
# ---------------------------- Save JSON File with Synonymous ----------------------------

with open('./vocabulary/synonymous.json', 'w') as json_file:
    json.dump(synonymous, json_file)

Vectorization

In [27]:
new_id_ingredients_cuisine_vectorized = {}

for index_recipe, recipe in enumerate(new_id_ingredients_cuisine):
    
    for ingredient in recipe["ingredients"]:
        
        new_id_ingredients_cuisine_vectorized[index_recipe] = recipe["ingredients"]

recipe_vector = {}
 
for recipe_id, ingredients in new_id_ingredients_cuisine_vectorized.items():
    
    recipe_vector[recipe_id] = []
    
    for ingredient in ingredients:
            
        recipe_vector[recipe_id].append(numpy.array(model[ingredient]))
                                    
    recipe_vector[recipe_id] = numpy.sum(numpy.array(recipe_vector[recipe_id]), 0) / len(recipe_vector[recipe_id])

X = numpy.array([xi for xi in list(recipe_vector.values())])
y = numpy.array(cuisines)

random_numbers = list(range(0, len(cuisines)))
random.shuffle(random_numbers)

y_mod = [cuisines[index] for index in random_numbers]
X_mod = [X[index] for index in random_numbers]
/Users/luisrita/PycharmProjects/HyperFoods/venv/lib/python3.6/site-packages/ipykernel_launcher.py:17: DeprecationWarning:

Call to deprecated `__getitem__` (Method will be removed in 4.0.0, use self.wv.__getitem__() instead).

Cuisine Classifier

SVM

In [28]:
%%time

if not path.exists('./trained_models/svc_model_cuisine_100.sav'):

    parameters = {'C': [0.00001, 0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000], 'max_iter': [5000], 'dual': [False], 'class_weight': ['balanced']}

    svc = LinearSVC()
    clf = GridSearchCV(svc, parameters, n_jobs=-1)
    clf.fit(X_mod, y_mod)
    
else:
    
    clf = pickle.load(open('./trained_models/svc_model_cuisine_100.sav', 'rb'))
CPU times: user 1.33 ms, sys: 1.37 ms, total: 2.7 ms
Wall time: 1.6 ms
In [105]:
pickle.dump(clf, open('./trained_models/svc_model_cuisine_100.sav', 'wb'))

Confusion Matrix

Compute confusion matrix to evaluate the accuracy of a classification. By definition a confusion matrix C is such that Ci,j is equal to the number of observations known to be in group i and predicted to be in group j.

In [46]:
def cm_analysis(y_true, y_pred, filename, labels, ymap=None, figsize=(20,15)):
    
    """
    Generate matrix plot of confusion matrix with pretty annotations.
    The plot image is saved to disk.
    args: 
      y_true:    true label of the data, with shape (nsamples,)
      y_pred:    prediction of the data, with shape (nsamples,)
      filename:  filename of figure file to save
      labels:    string array, name the order of class labels in the confusion matrix.
                 use `clf.classes_` if using scikit-learn models.
                 with shape (nclass,).
      ymap:      dict: any -> string, length == nclass.
                 if not None, map the labels & ys to more understandable strings.
                 Caution: original y_true, y_pred and labels must align.
      figsize:   the size of the figure plotted.
    """
    
    if ymap is not None:
        y_pred = [ymap[yi] for yi in y_pred]
        y_true = [ymap[yi] for yi in y_true]
        labels = [ymap[yi] for yi in labels]
        
    cm = confusion_matrix(y_true, y_pred, labels=labels)
    cm_sum = numpy.sum(cm, axis=1, keepdims=True)
    cm_perc = cm / cm_sum.astype(float) * 100
    annot = numpy.empty_like(cm).astype(str)
    nrows, ncols = cm.shape
    for i in range(nrows):
        for j in range(ncols):
            c = cm[i, j]
            p = cm_perc[i, j]
            if i == j:
                s = cm_sum[i]
                annot[i, j] = '%.1f%%' % (p)
            elif c == 0:
                annot[i, j] = '0.0%'
            else:
                annot[i, j] = '%.1f%%' % (p)
    cm = pandas.DataFrame(cm_perc, index=labels, columns=labels)
    cm.index.name = 'Actual'
    cm.columns.name = 'Predicted'
    fig, ax = pyplot.subplots(figsize=figsize, dpi=500)
    seaborn.heatmap(cm, annot=annot, fmt='', ax=ax, cmap="Greens", annot_kws={'size':14})
    pyplot.savefig(filename)

myorder = [6, 8, 10, 2, 7, 0, 4, 3, 9, 1, 5]

y_mod_mod = [y_mod[i] for i in myorder]
prediction = clf.predict(X_mod)
prediction_mod = numpy.array([list(prediction)[i] for i in myorder])
labels_mod = [list(set(y))[i] for i in myorder]
    
cm_analysis(y_mod, prediction, "confusion_poster", labels_mod)
['NorthernEuropean', 'SouthernEuropean', 'NorthernEuropean', 'SouthernEuropean', 'NorthAmerican', 'NorthAmerican', 'NorthAmerican', 'SouthernEuropean', 'NorthAmerican', 'NorthAmerican']
['NorthernEuropean' 'SouthernEuropean' 'NorthAmerican' 'SouthernEuropean'
 'NorthAmerican' 'NorthAmerican' 'NorthAmerican' 'SouthernEuropean'
 'LatinAmerican' 'NorthAmerican']
['SouthAsian', 'African', 'EasternEuropean', 'NorthAmerican', 'SoutheastAsian', 'MiddleEastern', 'SouthernEuropean', 'EastAsian', 'NorthernEuropean', 'LatinAmerican']
['NorthAmerican', 'NorthAmerican', 'EastAsian', 'NorthernEuropean', 'SouthernEuropean', 'NorthernEuropean', 'NorthAmerican', 'SouthernEuropean', 'NorthAmerican', 'SouthernEuropean']
['NorthAmerican' 'LatinAmerican' 'EastAsian' 'NorthAmerican'
 'SouthernEuropean' 'NorthernEuropean' 'NorthAmerican' 'SouthernEuropean'
 'NorthAmerican' 'SouthernEuropean']
['SouthernEuropean', 'NorthernEuropean', 'WesternEuropean', 'EasternEuropean', 'EastAsian', 'SouthAsian', 'SoutheastAsian', 'NorthAmerican', 'LatinAmerican', 'African']

K-Fold Cross Validation

In [46]:
print("Best estimator: " + str(clf.best_params_))
print("Mean cross-validated score of the best_estimator: " + str(clf.best_score_))
Best estimator: {'C': 0.001, 'class_weight': 'balanced', 'dual': False, 'max_iter': 5000}
Mean cross-validated score of the best_estimator: 0.6939532467532467

Recipe1M+ w/ Cuisines

Classifying

In [29]:
%%time
# ---------------------------- Adding Cuisines to Recipe1M+ Dataset ----------------------------

if not path.exists('./data/Recipe1M+/modified_modified_recipes_data_numeric1000.json'):

    modified_modified_recipes_data = {}
    modified_modified_recipes_data_numeric = {}

    # ------------------------

    cuisine2number = {}

    for position, cuisine in enumerate(list(set(cuisines))):

        cuisine2number[cuisine] = position

    # ------------------------

    ij = 0

    for recipe_id, vector in new_list.items():

        modified_modified_recipes_data[recipe_id] = clf.predict([new_list[recipe_id]])[0]
        modified_modified_recipes_data_numeric[recipe_id] = cuisine2number[clf.predict([new_list[recipe_id]])[0]]

        ij = ij + 1
        
else:
    
    with open('./data/Recipe1M+/modified_modified_recipes_data_numeric.json') as data_file:
        modified_modified_recipes_data_numeric = ast.literal_eval(data_file.read())
CPU times: user 3min 24s, sys: 3.42 s, total: 3min 28s
Wall time: 3min 39s
In [68]:
# ---------------------------- Generating New Recipe1M+ w/ Cuisines File ----------------------------

file = open('./data/Recipe1M+/modified_modified_recipes_data.json','w')
file.write(str(modified_modified_recipes_data))
Out[68]:
32619202

Visualizing

In [69]:
# Recipe1M+ colored recipe nodes accordingly to the cuisine they belong.
matplotlib_function(input1, input2, input3, list(modified_modified_recipes_data_numeric.values())[0:len(input1)], input5, "Recipes", False)

Cuisines -> Anticancer Average Score

In [55]:
#recipe_cancerscore

all_cuisines = set()

for recipe_id, cuisine in modified_modified_recipes_data_numeric.items():
    
    all_cuisines.add(cuisine)
    
cuisine_recipeIds = {}

for cuisine1 in list(all_cuisines):
    
    cuisine_recipeIds[cuisine1] = []
    
    for recipe_id, cuisine2 in modified_modified_recipes_data_numeric.items():
        
        if cuisine1 == cuisine2:
            
            cuisine_recipeIds[cuisine1].append(recipe_id)
            
cuisine_antiCScore = {}
            
for cuisine, recipeIds in cuisine_recipeIds.items():
    
    cuisine_antiCScore[cuisine] = 0
    
    for recipeID in recipeIds:
        
        cuisine_antiCScore[cuisine] = cuisine_antiCScore[cuisine] + recipe_cancerscore[recipeID]/len(recipeIds)
    
print(cuisine_antiCScore)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
{0: 2.480772770243864, 1: 1.7527405884799663, 2: 1.3163746055369465, 3: 1.90394898549515, 4: 1.9015769556011153, 5: 1.3049224837273246, 6: 1.252703722677007, 7: 2.08221741034203, 8: 1.4940592445968917, 9: 2.208558633439434, 10: 1.2516017765780485}

Retrieving Ingredients, Quantities and Units

In [ ]:
%%time 
# recipes_data is the list obtained by loading layer1.json 

ingredients_vocab = []
units_vocab = []

stop_words = set(stopwords.words('english'))

intab = '''!()-[]{};:'"\,<>?@#$%^&*_~'''
outtab = "_" * len(intab)
trantab = str.maketrans(intab, outtab)

lemmatizer = WordNetLemmatizer()

f = open("./vocabulary/ingredients_vocabulary/ingr_vocab_lemmatized_stopwords.txt", "r")

for x in f:
    ingredients_vocab.append(x.replace("\n", ""))

f.close()

def order(e):
    return len(e)

f = open('./vocabulary/units_vocabulary/units_list_lemmatized_stopwords.txt', "r")

for x in f:
    units_vocab.append(x.replace("\n", ""))
    
f.close()

def isfraction(s):
    values = s.split('/')
    return len(values) == 2 and all(i.isdigit() for i in values)

ingredients_vocab.sort(key=order, reverse=True)

def ingredient_quantities(ingredient_sentence, ingredients_vocab, units_vocab):
    
    output = []

    # -------------------------------- Preprocessing Recipe Dataset
    
    modified_ingredient_sentence = " ".join([lemmatizer.lemmatize(w.translate(trantab).replace("_", "").lower()) for w in ingredient_sentence.split(" ") if w not in stop_words])  
    
    for word_ingredient_vocab in ingredients_vocab:
        
        if len(word_ingredient_vocab.split(" ")) > 1 and word_ingredient_vocab in modified_ingredient_sentence:
                        
            modified_ingredient_sentence = modified_ingredient_sentence.replace(word_ingredient_vocab, word_ingredient_vocab.replace(" ", "ç"))
            
    modified_ingredient_sentence = modified_ingredient_sentence.split(" ")
                                
    modified_ingredient_sentence2 = [w.replace("ç", " ") for w in modified_ingredient_sentence if w.replace("ç", " ") in ingredients_vocab or w in units_vocab or isfraction(w) or w.isnumeric()]
    
    modified_modified_ingredient_sentence = modified_ingredient_sentence2
    
    # -------------------------------- Extracting Ingredients, Quantities and Units
    
    for position, word_ingredient_vocab in enumerate(ingredients_vocab): # Iteration over all the ingredients present in the vocaulary input by the user.
                
        if word_ingredient_vocab in modified_modified_ingredient_sentence:
            
            ingredientPosition = modified_modified_ingredient_sentence.index(word_ingredient_vocab)
    
            for unit_index, unit in enumerate(units_vocab):
            
                if unit in modified_modified_ingredient_sentence:
                
                    isIngredientAfterUnit = modified_modified_ingredient_sentence.index(unit) < modified_modified_ingredient_sentence.index(word_ingredient_vocab)
                    unitPosition = modified_modified_ingredient_sentence.index(unit)             
            
                    # Integer number immediately before the unit and a fraction before the previous. 

                    if unitPosition - 2 > -1 and modified_modified_ingredient_sentence[unitPosition - 1].isnumeric() and isfraction(modified_modified_ingredient_sentence[unitPosition - 2]) and isIngredientAfterUnit:

                        fraction = modified_modified_ingredient_sentence[unitPosition - 2].split("/")

                        output.append({"ingredient": word_ingredient_vocab, "quantity": float(modified_modified_ingredient_sentence[unitPosition - 1]) * float(fraction[0]) / float(fraction[1]), "units": unit})      

                        break

                    # Number immediately before the unit.

                    elif unitPosition - 2 > -1 and isfraction(modified_modified_ingredient_sentence[unitPosition - 1]) and modified_modified_ingredient_sentence[unitPosition - 2].isnumeric() and isIngredientAfterUnit:

                        fraction = modified_modified_ingredient_sentence[unitPosition - 1].split("/")

                        output.append({"ingredient": word_ingredient_vocab, "quantity": float(modified_modified_ingredient_sentence[unitPosition - 2]) * float(fraction[0])/float(fraction[1]), "units": unit})

                        break

                    elif unitPosition - 1 > -1 and modified_modified_ingredient_sentence[unitPosition - 1].isnumeric() and isIngredientAfterUnit:

                        output.append({"ingredient": word_ingredient_vocab, "quantity": float(modified_modified_ingredient_sentence[unitPosition - 1]), "units": unit})      

                        break

                    elif unitPosition - 2 > - 1 and modified_modified_ingredient_sentence[unitPosition - 1].isnumeric() and modified_modified_ingredient_sentence[unitPosition - 2].isnumeric() and isIngredientAfterUnit:

                        output.append({"ingredient": word_ingredient_vocab, "quantity": float(modified_modified_ingredient_sentence[unitPosition - 1]) * float(modified_modified_ingredient_sentence[unitPosition - 2]), "units": unit})      

                        break

                    elif unitPosition - 1 > -1 and isfraction(modified_modified_ingredient_sentence[unitPosition - 1]) and isIngredientAfterUnit:

                        fraction = modified_modified_ingredient_sentence[unitPosition - 1].split("/")

                        output.append({"ingredient": word_ingredient_vocab, "quantity": float(fraction[0])/float(fraction[1]), "units": unit})

                        break
                        
                elif unit_index == len(units_vocab) - 1:                  

                    if ingredientPosition - 1 > - 1 and modified_modified_ingredient_sentence[ingredientPosition - 1].isnumeric():

                        output.append({"ingredient": word_ingredient_vocab, "quantity": float(modified_modified_ingredient_sentence[ingredientPosition - 1]), "units": None})

                        break

                    elif ingredientPosition - 2 > - 1 and modified_modified_ingredient_sentence[ingredientPosition - 2].isnumeric():

                        output.append({"ingredient": word_ingredient_vocab, "quantity": float(modified_modified_ingredient_sentence[ingredientPosition - 2]), "units": None})

                        break

                    else:

                        output.append({"ingredient": word_ingredient_vocab, "quantity": 1.0, "units": None})

                        break
                                    
    return output

def auxx11 (recipe):
    
    output_aux = []
    
    for ingredient in recipe["ingredients"]:
        output_aux.append(ingredient_quantities(ingredient["text"], ingredients_vocab, units_vocab))
                        
    return output_aux

num_cores = multiprocessing.cpu_count()

out_output = Parallel(n_jobs=num_cores)(delayed(auxx11)(recipe) for recipe in recipes_data[0:2])

final = {}

for key, value in enumerate(out_output):
        
    final[recipes_data[key]["id"]] = value
    
print(out_output)
In [ ]:
with open('./id_quantities_units_ingredients.json', 'w') as json_file:
    
    json.dump(final, json_file)
In [ ]:
%%time
f = open('./vocabulary/nutritional_data/ingredient_mediumSize.json')
ingredient_mediumSize = json.load(f)
f.close()

stop_words = set(stopwords.words('english'))

intab = '''!()-[]{};:'"\,<>./?@#$%^&*_~'''
outtab = "_" * len(intab)
trantab = str.maketrans(intab, outtab)

lemmatizer = WordNetLemmatizer()

modified_ingredient_mediumSize = {}

for key, value in ingredient_mediumSize.items():
    
    word_tokens = word_tokenize(key)
    
    modified_ingredient_mediumSize[" ".join([lemmatizer.lemmatize(w.translate(trantab).replace("_", "").lower()) for w in word_tokens if w not in stop_words])] = value
In [ ]:
with open('./vocabulary/nutritional_data/ingredient_mediumSize_lemmatized_stopwords.json', 'w') as json_file:
    
    json.dump(modified_ingredient_mediumSize, json_file)
In [ ]:
%%time

# Converting Quantities to Grams

ingredient_mediumSize = modified_ingredient_mediumSize

ac_data = pandas.read_csv("./vocabulary/synonymous/units_list_lemmatized_stopwords.csv", delimiter = ",")
ac_data.head()

lemmatizer = WordNetLemmatizer()

# Converting DataFrame to Dictionary

metric_grams = {}

for index, row in ac_data.iterrows():
    
    metric_grams[row['units']] = row['grams']
    
final_grams = final

for recipe_id, recipe in final.items():
    
    for ingredients_id, ingredients in enumerate(recipe):
        
        for ingredient_id, ingredient in enumerate(ingredients):
            
            if ingredient and ingredient["units"] != None:
                
                final_grams[recipe_id][ingredients_id][ingredient_id]["quantity"] = float(ingredient["quantity"]) * float(metric_grams[lemmatizer.lemmatize(ingredient["units"])])
                final_grams[recipe_id][ingredients_id][ingredient_id]["units"] = "grams"
                
            elif ingredient and ingredient["ingredient"] in ingredient_mediumSize.keys() and ingredient_mediumSize[ingredient["ingredient"]]["weight"] != "NA":
                
                final_grams[recipe_id][ingredients_id][ingredient_id]["quantity"] = float(ingredient["quantity"]) * float(ingredient_mediumSize[ingredient["ingredient"]]["weight"])
                final_grams[recipe_id][ingredients_id][ingredient_id]["units"] = "grams"
                
            elif ingredient:
                
                final_grams[recipe_id][ingredients_id][ingredient_id]["quantity"] = float(ingredient["quantity"]) * 10
                final_grams[recipe_id][ingredients_id][ingredient_id]["units"] = "grams"
In [108]:
print(final_grams["2eb042cbc3"])
[[], [{'ingredient': 'coconut', 'quantity': 120.0, 'units': 'grams'}, {'ingredient': 'olive', 'quantity': 120.0, 'units': 'grams'}, {'ingredient': 'oil', 'quantity': 120.0, 'units': 'grams'}], [{'ingredient': 'tea', 'quantity': 435360.0, 'units': 'grams'}], [{'ingredient': 'peppermint', 'quantity': 2.0, 'units': 'grams'}, {'ingredient': 'oil', 'quantity': 2.0, 'units': 'grams'}], [{'ingredient': 'essential oil', 'quantity': 4.0, 'units': 'grams'}], [{'ingredient': 'lavender', 'quantity': 4.0, 'units': 'grams'}, {'ingredient': 'oil', 'quantity': 4.0, 'units': 'grams'}]]

Ingredient Frequency

Recipe1M+

In [93]:
%%time 
# Retrieving Units Frequency
# recipes_data is the list obtained by loading layer1.json 

import collections

ingredients_vocab = []
units_vocab = []

stop_words = set(stopwords.words('english'))

intab = '''!()-[]{};:'"\,<>?@#$%^&*_~'''
outtab = "_" * len(intab)
trantab = str.maketrans(intab, outtab)

lemmatizer = WordNetLemmatizer()

f = open("./vocabulary/ingredients_vocabulary/ingr_vocab_lemmatized_stopwords.txt", "r")

for x in f:
    ingredients_vocab.append(x.replace("\n", ""))

f.close()

def order(e):
    return len(e)

f = open('./vocabulary/units_vocabulary/units_list_lemmatized_stopwords.txt', "r")

for x in f:
    units_vocab.append(x.replace("\n", ""))
    
f.close()

def isfraction(s):
    values = s.split('/')
    return len(values) == 2 and all(i.isdigit() for i in values)

ingredients_vocab.sort(key=order, reverse=True)

def ingredient_quantities(ingredient_sentence, ingredients_vocab, units_vocab):
    
    output = {}

    # -------------------------------- Preprocessing Recipe Dataset
    
    modified_ingredient_sentence = " ".join([lemmatizer.lemmatize(w.translate(trantab).replace("_", "").lower()) for w in ingredient_sentence.split(" ") if w not in stop_words])  
    
    for word_ingredient_vocab in ingredients_vocab:
        
        if len(word_ingredient_vocab.split(" ")) > 1 and word_ingredient_vocab in modified_ingredient_sentence:
                        
            modified_ingredient_sentence = modified_ingredient_sentence.replace(word_ingredient_vocab, word_ingredient_vocab.replace(" ", "ç"))
            
    modified_ingredient_sentence = modified_ingredient_sentence.split(" ")
                                
    modified_ingredient_sentence2 = [w.replace("ç", " ") for w in modified_ingredient_sentence if w.replace("ç", " ") in ingredients_vocab or w in units_vocab or isfraction(w) or w.isnumeric()]
    
    modified_modified_ingredient_sentence = modified_ingredient_sentence2
    
    # -------------------------------- Extracting Ingredients, Quantities and Units
    
    for position, word_ingredient_vocab in enumerate(ingredients_vocab): # Iteration over all the ingredients present in the vocaulary input by the user.
                
        if word_ingredient_vocab in modified_modified_ingredient_sentence:
            
            if word_ingredient_vocab in output.keys():
            
                output[word_ingredient_vocab] = output[word_ingredient_vocab] + 1
                
            else:
                
                output[word_ingredient_vocab] = 1
                                    
    return output

def auxx11 (recipe):
    
    output_aux = []
    
    for ingredient in recipe["ingredients"]:
        output_aux.append(ingredient_quantities(ingredient["text"], ingredients_vocab, units_vocab))
                        
    return output_aux

num_cores = multiprocessing.cpu_count()

out_output = Parallel(n_jobs=num_cores)(delayed(auxx11)(recipe) for recipe in recipes_data)



final = {}

for key, value in enumerate(out_output):
    
    for indexx, unit in enumerate(value):
        
        for key2, value2 in unit.items():
            
            if key2 in final.keys():
            
                final[key2] = final[key2] + value2
                
            else:
                
                final[key2] = 1

od = {k: v for k, v in sorted(final.items(), key=lambda item: item[1])}

print(od)
{'durkee sauce': 1, 'quick cooking long grain wild rice mix': 1, 'sun dried tomato dressing': 1, 'semi sweet chocolate baking square': 1, 'vol au vent case': 1, 'carbonated lemon lime beverage': 1, 'emeril original essence': 2, 'reese piece': 2, 'cherry kool aid': 3, 'weet bix': 3, 'miniature baking bit': 3, 'semi sweet chocolate bit': 4, 'crabstick': 4, 'koshi': 4, 'gold leaf foil': 6, 'recipe cream filling': 7, 'low calorie raspberry drink mix': 7, 'reduced calorie cranberry juice cocktail': 8, 'frozen potato slice': 8, 'cross rib roast': 8, 'pasteurized liquid egg white': 10, 'pastry single crust pie': 10, 'quik chocolate milk mix': 10, 'zatarain': 10, 'pinecone': 11, 'italian salad mix': 11, 'low fat granola': 13, 'dog food': 13, 'dried tamarind': 13, 'walleyed pike fillet': 13, 'center cut pork loin chop': 14, 'lsa': 14, 'instant tang orange drink': 15, 'nasturtium petal': 15, 'pumpernickel round': 15, 'tamarillo': 15, 'baking hen': 15, 'reese peanut butter cup': 15, 'whole black bass': 15, 'quatre epices': 15, 'original ranch dressing mix': 16, 'nestle milk chocolate peanut butter swirled morsel': 16, 'soy lecithin': 16, 'foil liner': 16, 'refrigerated cornbread twist dough': 16, 'canadian rye whisky': 17, 'green tomatillo sauce': 17, 'sweet sour cocktail mix': 17, 'tandoori spice mix': 17, 'frozen strawberry daiquiri concentrate': 17, 'velveeta shell cheese dinner': 17, 'almond half': 17, 'brown wild rice mix': 18, 'chai concentrate': 18, 'unsalted sunflower seed kernel': 18, 'oxo beef cube': 18, 'finnan haddie': 18, 'cling peach half': 18, 'pastry double crust pie': 19, 'dried vegetable flake': 19, 'mojo criollo': 19, 'imitation maple flavor': 19, 'herring wine sauce': 19, 'nabisco triscuits': 19, 'sun dried tomato pesto': 19, 'frito scoop': 19, 'yolk egg noodle substitute': 19, 'magic shell ice cream topping': 20, 'dairy creamer': 20, 'edible orchid': 20, 'dried pasta shape': 20, 'roasting bag': 20, 'gomashio': 20, 'vegetable cocktail': 20, 'huitlacoche': 20, 'korma paste': 20, 'frozen pina colada mix': 20, 'herman starter': 21, 'fiber supplement': 21, 'edible silver foil': 21, 'salted herring': 21, 'beef wiener': 21, 'dulse flake': 21, 'nasturtium leaf': 21, 'dish detergent': 21, 'sweet low': 21, 'dhaniya powder': 21, 'whitebait': 22, 'sparerib rack': 22, 'turkish delight': 22, 'empanada wrapper': 22, 'cactus piece': 22, 'tostados': 22, 'hershey hug chocolate': 23, 'kewra essence': 23, 'lotion': 23, 'whole wheat rigatoni': 23, 'quorn piece': 23, 'earth balance natural buttery spread': 23, 'raspberry chipotle sauce': 24, 'wattleseed': 24, 'fresh lotus root': 24, 'yoshida gourmet sauce': 24, 'cherry drink mix': 24, 'sambhar powder': 24, 'tom yum paste': 24, 'strega': 24, 'demi glace': 24, 'meatless sauce': 25, 'amchoor powder': 25, 'dried funghi porcini': 25, 'fernet branca': 25, 'soap bar': 25, 'instant oxo': 25, 'bee pollen': 25, 'dried banana piece': 25, 'dried lemon grass': 25, 'rucola': 25, 'bragg amino acid': 26, 'unsweetened vanilla almond breeze': 26, 'fresh galangal root': 26, 'berry blue gelatin mix': 26, 'calendula flower': 26, 'sweetened lemonade drink mix': 26, 'nestle toll house premier white morsel': 26, 'mandarin segment': 26, 'junior mint': 26, 'sweet red pepper strip': 26, 'weetabix': 26, 'freekeh': 26, 'tartaric': 26, 'frozen petits poi': 26, 'xylitol sweetener': 26, 'blintz': 26, 'ogo': 27, 'sure jell': 27, 'nopalitos': 27, 'au gratin potato mix': 27, 'morton nature season seasoning blend': 27, 'char siu sauce': 28, 'hyssop': 28, 'gravlax': 28, 'chamomile flower': 28, 'fried corn tortilla strip': 28, 'tamarind pod': 28, 'medium sharp cheddar': 28, 'mccormick season': 28, 'beau monde spice': 28, 'round rice paper sheet': 28, 'creme de noyaux': 28, 'shampoo': 29, 'jamon serrano': 29, 'clay': 29, 'low fat ricotta': 29, 'almond toffee bit': 29, 'pillsbury refrigerated crusty french loaf': 29, 'dried lily bud': 29, 'bottarga': 29, 'bird seed': 29, 'robin hood nutri flour blend': 30, 'bath soap': 30, 'mirliton': 30, 'alcaparrado': 30, 'bleach': 30, 'ti leaf': 30, 'green gram': 30, 'whole wheat orzo': 30, 'kim chee': 30, 'tarama': 30, 'fresca soda': 30, 'sierra mist': 30, 'verjuice': 30, 'dandelion flower': 30, 'risoni': 30, 'dried kasha': 30, 'cherry soda': 31, 'dried black fungus': 31, 'dry enchilada mix': 31, 'unsweetened flavored drink mix': 31, 'methi leaf': 31, 'pignolis': 31, 'korean red pepper powder': 31, 'chipotle paste': 31, 'tiger sauce': 31, 'greek dressing': 32, 'kraft natural blue cheese crumbles': 32, 'morningstar farm meal starter grillers recipe crumbles': 32, 'pimento strip': 32, 'rose essence': 32, 'blueberry sauce': 32, 'diet soda': 32, 'ground annatto seed': 32, 'wood chunk': 32, 'raspberry coulis': 32, 'malanga': 32, 'breadfruit': 32, 'carnitas': 32, 'piri piri': 33, 'malt drink powder': 33, 'dry coconut powder': 33, 'szechuan sauce': 33, 'nestle toll house butterscotch flavored morsel': 33, 'quince paste': 33, 'mesquite powder': 34, 'pluots': 34, 'washing soda': 34, 'active starter': 34, 'hawaiian punch drink': 34, 'caponata': 34, 'dry sweetener': 34, 'plain sweet biscuit crumb': 34, 'cardoon': 34, 'hydrogen peroxide': 34, 'crumpet': 34, 'lumpia skin': 35, 'raita': 35, 'romesco sauce': 35, 'boneless duck breast half': 35, 'hidden valley original ranch dressing mix': 35, 'yamaimo': 36, 'vegan burger': 36, 'callaloo': 36, 'pappadams': 36, 'fruitcake': 36, 'molly mcbutter': 36, 'cracked farro': 36, 'ground elk': 36, 'pickled daikon': 36, 'splenda quick pack': 36, 'dukkah': 36, 'patis': 36, 'amish starter': 37, 'clear jel': 37, 'bugle original flavor snack': 37, 'aloe vera gel': 37, 'maltesers': 37, 'wheatberries': 37, 'butterfinger bar': 37, 'loganberry': 38, 'vegeta': 38, 'favorite dressing': 38, 'pepperidge farm stuffing': 38, 'grain paradise': 38, 'olivada': 38, 'elderflower cordial': 39, 'gai lan': 39, 'butterscotch topping': 39, 'favorite sauce': 39, 'stew beef chunk': 39, 'sumaq': 40, 'medium sherry': 40, 'tape': 40, 'saunf': 40, 'brinjal': 41, 'rye flake': 41, 'saba': 41, 'dried chamomile': 41, 'spicy bbq sauce': 41, 'pig tail': 41, 'soy chorizo': 41, 'fideos': 42, 'green sprinkle': 42, 'rusk': 42, 'portuguese chourico': 42, 'maca': 42, 'smoked whitefish': 42, 'scalloped potato mix': 42, 'squirrel': 42, 'rennet': 43, 'topping mix': 43, 'witch hazel': 43, 'jerk sauce': 43, 'instant cappuccino mix': 43, 'manwich sloppy joe mix': 43, 'jackfruit': 43, 'energy drink': 44, 'pawpaw': 44, 'rose hip': 44, 'kool aid': 44, 'muslin': 44, 'falafel': 44, 'herbsaint': 44, 'tostitos scoop': 44, 'nestle quik': 44, 'italian sauce': 45, 'caperberries': 45, 'shichimi togarashi': 45, 'almond filling': 46, 'white baking bar': 46, 'white port': 47, 'pot sticker': 47, 'bisto': 47, 'au jus sauce': 47, 'nettle': 47, 'lamb kidney': 48, 'cannelloni tube': 48, 'saltpeter': 48, 'pickled herring': 48, 'spirulina': 48, 'chimichurri sauce': 48, 'pea tendril': 48, 'caribou': 48, 'advocaat': 48, 'stir fry sauce': 48, 'choy sum': 48, 'patty shell': 48, 'cherry heering': 48, 'recaito': 48, 'crackling': 49, 'instant white chocolate pudding pie filling mix': 49, 'lecithin granule': 49, 'favorite barbecue rub': 49, 'escargot': 49, 'rolo chocolate': 50, 'walnut meat': 50, 'peep': 50, 'powdered soy protein concentrate': 50, 'bresaola': 50, 'crispbread': 50, 'colored sugar sprinkle': 50, 'powdered chocolate milk mix': 51, 'romanesco': 51, 'conchiglie': 51, 'dough enhancer': 51, 'brown paper bag': 52, 'posole': 52, 'oven cooking bag': 52, 'sago': 53, 'dashida': 53, 'carambola': 53, 'cannoli shell': 53, 'scampi': 53, 'bolognese sauce': 53, 'geranium leaf': 53, 'crabapple': 54, 'canned peach half': 54, 'khoya': 54, 'eau de vie': 54, 'satay sauce': 54, 'soda pop': 54, 'sambuca romana': 54, 'low calorie sweetener': 54, 'asafoetida powder': 54, 'gremolata': 55, 'abalone': 55, 'milo': 55, 'boca meatless ground burger': 55, 'smart balance light butter spread': 56, 'pepperidge farm herb stuffing': 56, 'rock cornish game hen': 56, 'frog leg': 56, 'cuttlefish': 56, 'tatsoi': 56, 'jagermeister': 56, 'citrus zest': 56, 'bacardi limon': 57, 'kasuri methi': 57, 'chive blossom': 57, 'pastis': 57, 'cavolo nero': 57, 'sopressata': 58, 'pocketless pita': 58, 'kefalotiri': 58, 'ascorbic acid': 58, 'sundae sauce': 58, 'pierogi': 58, 'thin cucumber slice': 58, 'flavor enhancer': 58, 'guinness draught': 59, 'barberry': 59, 'hostess twinkie': 59, 'nopales': 59, 'peri peri': 59, 'korean red pepper paste': 59, 'salsify': 60, 'butterfish': 60, 'fowl': 60, 'mirepoix': 60, 'jeera powder': 60, 'bearnaise sauce': 60, 'mulberry': 60, 'bass fillet': 61, 'borage': 62, 'blueberry muffin mix': 62, 'granola bar': 62, 'chinese duck sauce': 62, 'quahog': 62, 'bean mix': 62, 'beeswax': 62, 'black gram': 62, 'frosted flake': 63, 'smelt': 63, 'hidden valley original ranch dip mix': 63, 'copha': 64, 'verjus': 64, 'angelica': 64, 'ajinomoto': 64, 'reserved juice': 64, 'pak choi': 64, 'crushed red chile flake': 64, 'pompano': 64, 'gourd': 64, 'milky way bar': 65, 'mar bar': 65, 'hatch chile': 66, 'skor english toffee bit': 66, 'tobiko': 66, 'sloppy joe sandwich sauce': 66, 'powdered cocoa mix': 66, 'remoulade sauce': 67, 'tang orange crystal': 67, 'raw cacao powder': 67, 'pina colada nonalcoholic drink mix': 67, 'epsom salt': 67, 'tandoori paste': 68, 'farfel': 68, 'five spice powder': 68, 'tangelo': 68, 'plastic cup': 69, 'walleye': 69, 'glycerine': 69, 'foam': 69, 'liverwurst': 70, 'boule': 70, 'nonstick spray coating': 70, 'elderberry': 71, 'spice essence': 71, 'candied citron peel': 71, 'citrus fruit': 72, 'knockwurst': 72, 'soy protein': 72, 'hot roll mix': 73, 'miniature party rye round': 74, 'black olive paste': 74, 'peanut brittle': 75, 'mixed cheese': 76, 'boneless beef cube': 76, 'licor': 76, 'baby back rib rack': 76, 'candlenut': 76, 'chapati': 76, 'goldschlager': 77, 'ground caraway': 77, 'dried hot red chile': 77, 'kefalotyri': 78, 'instant chocolate drink mix': 78, 'sweetbread': 78, 'purslane': 79, 'queso anejo': 79, 'bitter melon': 79, 'vin santo': 79, 'capon': 79, 'dipper': 79, 'laurel': 80, 'moose': 80, 'carp': 80, 'pan juice': 80, 'rockfish': 80, 'shad': 81, 'kirschwasser': 81, 'pandan leaf': 82, 'perciatelli': 82, 'aquavit': 82, 'cooking sauce': 82, 'duckling': 82, 'tonkatsu sauce': 82, 'jamaican jerk spice': 83, 'panettone': 83, 'yucca root': 84, 'dried italian salad dressing mix': 84, 'konbu': 84, 'baharat': 85, 'kashi': 85, 'sansho': 86, 'sourdough loaf': 86, 'kudzu': 86, 'raspberry sauce': 87, 'tubetti': 87, 'skate': 87, 'ground aniseed': 88, 'cornichon': 88, 'nutmeats': 88, 'arctic char': 89, 'spray bottle': 89, 'pimms': 89, 'brown sauce': 90, 'glue': 90, 'caciocavallo': 91, 'erythritol': 91, 'surimi': 92, 'skinless boneless turkey breast': 92, 'conch': 93, 'mountain dew soda': 93, 'white creme de menthe': 93, 'dried hibiscus flower': 94, 'au jus mix': 94, 'amchur': 94, 'ammonia': 94, 'marmite': 94, 'hop': 94, 'miniature phyllo cup': 94, 'mild chile': 95, 'ovaltine': 95, 'fresh lime leaf': 95, 'matcha green tea powder': 96, 'lillet blanc': 96, 'squab': 96, 'pastina': 96, 'psyllium': 97, 'cassia': 97, 'canned jalapeno slice': 97, 'okonomiyaki sauce': 98, 'dumpling wrapper': 98, 'pastry crust': 100, 'shark': 101, 'shortcake': 101, 'low fat mozzarella': 101, 'radiatore': 101, 'pickapeppa sauce': 102, 'french haricot vert': 102, 'gyoza skin': 103, 'creme anglaise': 103, 'soppressata': 104, 'glycerin': 104, 'ajwain': 105, 'cavatelli': 105, 'ink': 105, 'gumbo file': 106, 'borax': 106, 'lox': 106, 'teff': 106, 'rapini': 106, 'pen': 106, 'pollock': 107, 'eel': 107, 'berbere': 108, 'trail mix': 108, 'dove': 108, 'brie round': 109, 'crumb topping': 109, 'schmaltz': 109, 'drambuie': 109, 'hot chocolate powder': 110, 'good seasoning italian salad dressing mix': 110, 'dried celery flake': 111, 'soy crumbles': 112, 'pig foot': 112, 'mezcal': 113, 'fromage blanc': 113, 'parmesan rind': 114, 'fiddlehead': 114, 'bird eye chile': 114, 'velveeta reduced fat cheese product': 115, 'fine herbes': 115, 'veggie crumbles': 115, 'bloody mary mix': 116, 'kamaboko': 117, 'fromage frais': 118, 'smart balance butter spread': 118, 'gelato': 118, 'ponzu sauce': 119, 'porter': 119, 'tripe': 119, 'kamut': 120, 'bream': 120, 'anisette': 120, 'nuoc nam': 120, 'dried new mexico chile': 120, 'candied peel': 122, 'huckleberry': 122, 'tender quick': 122, 'creme de banane': 123, 'benedictine': 123, 'almond powder': 124, 'culantro': 124, 'ra el hanout spice mix': 124, 'pepsi': 126, 'pizza topping': 126, 'ziploc bag': 126, 'mixed peel': 126, 'glitter': 127, 'malted milk ball': 127, 'hake': 127, 'tart crust': 128, 'speck': 128, 'refrigerated breadstick dough': 128, 'capicola': 128, 'breading': 131, 'ranch dip': 131, 'whole wheat rotini': 132, 'citrus peel': 132, 'dip mix': 133, 'cockle': 133, 'lovage': 134, 'pisco': 134, 'frozen mango chunk': 134, 'dry rub seasoning': 134, 'scone': 134, 'stuffing cube': 135, 'dragee': 135, 'mitsuba': 135, 'crayfish': 136, 'cassava': 138, 'piloncillo': 138, 'sofrito sauce': 139, 'soybean paste': 139, 'alum': 140, 'snail': 142, 'muesli': 143, 'mole': 143, 'miniature peanut butter cup': 143, 'panir': 144, 'kumara': 145, 'quark': 146, 'perch': 147, 'gummy worm': 148, 'chard leaf': 148, 'cashew half': 149, 'absinthe': 150, 'cashew piece': 151, 'powdered drink mix': 152, 'ground fenugreek': 153, 'gooseberry': 153, 'gingersnap crumb': 154, 'giardiniera': 154, 'cedar plank': 154, 'green creme de menthe': 154, 'balsamic dressing': 155, 'swede': 156, 'romaine leaf': 157, 'lingonberry': 157, 'doughnut': 158, 'agar': 158, 'charcoal': 158, 'taleggio': 159, 'violet': 160, 'matzoh': 161, 'fructose': 161, 'grappa': 162, 'deer': 166, 'fondant': 167, 'bluefish': 167, 'buckwheat groat': 168, 'fresh edible flower': 170, 'ramp': 171, 'unbaked pastry shell': 171, 'rolling pin': 172, 'cachaca': 175, 'lasagna sheet': 176, 'hershey bar': 177, 'almond essence': 178, 'canela': 178, 'ketjap manis': 180, 'tzatziki': 181, 'tamale': 181, 'kefir': 182, 'canned diced green chile': 182, 'taro root': 185, 'pie plate': 186, 'splenda sugar blend baking': 186, 'galliano': 186, 'applejack': 187, 'veggie burger': 187, 'green salad': 187, 'white karo': 188, 'bean dip': 188, 'jaggery': 190, 'fresh mozzarella ball': 191, 'graham wafer crumb': 191, 'tasso': 191, 'boar': 191, 'paraffin wax': 193, 'kitchen twine': 195, 'crostini': 196, 'biscotti': 197, 'guar gum': 198, 'pig': 199, 'serranos': 199, 'chayote': 200, 'tia maria': 200, 'dessert topping': 200, 'carob powder': 202, 'hing': 205, 'bechamel sauce': 206, 'browning sauce': 206, 'queso blanco': 208, 'kohlrabi': 208, 'mutton': 210, 'pigeon': 212, 'ouzo': 213, 'armagnac': 215, 'besan': 216, 'sauterne': 218, 'file powder': 218, 'kelp': 219, 'foie gras': 221, 'bird chile': 222, 'gingerbread': 223, 'limeade': 223, 'konnyaku': 224, 'bean curd': 228, 'mache': 228, 'treacle': 230, 'sweet sherry': 230, 'whole nutmeg': 230, 'reynolds wrap foil': 230, 'smokies': 231, 'striped bass': 232, 'hollandaise sauce': 232, 'tawny port': 233, 'marrow': 233, 'farina': 233, 'chablis': 233, 'hershey chocolate kiss': 233, 'salad leaf': 233, 'lollipop': 234, 'praline': 234, 'ha avocadoes': 234, 'diced green chili': 235, 'texas pete': 235, 'vitamin': 238, 'truvia': 239, 'poundcake': 240, 'textured vegetable protein': 242, 'broiler': 242, 'arbol chile': 244, 'peanut sauce': 244, 'margarita mix': 246, 'pea shoot': 246, 'colored sprinkle': 250, 'citric acid': 251, 'pastrami': 252, 'vegemite': 254, 'pheasant': 255, 'seitan': 255, 'cloth': 256, 'fenugreek leaf': 259, 'filbert': 261, 'pita pocket': 261, 'sazon goya': 263, 'condiment': 265, 'jiffy corn muffin mix': 265, 'nonpareil': 266, 'quince': 266, 'ganache': 267, 'montrachet': 267, 'popsicle': 268, 'amaranth': 270, 'marzipan': 273, 'mizuna': 274, 'spearmint': 274, 'prepared stuffing': 276, 'mortadella': 280, 'bean thread': 282, 'tamarind pulp': 282, 'epazote': 283, 'grape leaf': 284, 'hidden valley ranch dressing mix': 285, 'burdock root': 287, 'coco lopez': 287, 'sweetcorn': 290, 'lardons': 293, 'rose petal': 294, 'carbonated beverage': 297, 'long grain wild rice blend': 301, 'octopus': 304, 'veg': 305, 'macaroon': 305, 'capellini': 307, 'tostada': 307, 'frankfurter': 307, 'gumdrop': 310, 'sorrel': 310, 'umeboshi': 310, 'aioli': 311, 'spaghettini': 311, 'english toffee': 313, 'decorating gel': 313, 'lychee': 314, 'broccolini': 314, 'pie pastry': 315, 'okara': 315, 'bocconcini': 318, 'tartar sauce': 321, 'ranch style bean': 328, 'boston butt': 329, 'ahi': 329, 'pasilla chile': 329, 'sweet sour sauce': 330, 'coke': 333, 'white sauce': 334, 'sucanat': 334, 'meatloaf': 335, 'oxtail': 335, 'breadstick': 338, 'spring roll wrapper': 339, 'heart palm': 343, 'guinness stout': 343, 'kumquat': 345, 'shortcrust pastry': 346, 'alcohol': 350, 'tapenade': 350, 'english pea': 351, 'dry ranch dressing mix': 360, 'bragg liquid amino': 364, 'burrito': 364, 'creme de cassis': 366, 'gochujang': 372, 'mexicorn': 372, 'prepared graham cracker crust': 376, 'mahi mahi': 376, 'spanish chorizo': 379, 'roux': 385, 'mincemeat': 385, 'kitchen bouquet': 385, 'prosecco': 386, 'bologna': 386, 'campari': 387, 'medium cheddar': 393, 'dumpling': 396, 'limoncello': 398, 'sponge cake': 398, 'creme de menthe': 399, 'certo': 402, 'calamari': 409, 'shoyu': 409, 'tart shell': 409, 'pate': 413, 'baby food': 413, 'sour mix': 414, 'amaretti': 415, 'spam': 417, 'passata': 418, 'suet': 419, 'essential oil': 419, 'grouper': 422, 'persimmon': 424, 'beetroot': 425, 'zinfandel': 426, 'sumac': 427, 'ricotta salata': 432, 'achiote': 435, 'celeriac': 438, 'goose': 438, 'grana padano': 439, 'french fry': 440, 'ruby port': 440, 'chile de arbol': 443, 'french style green bean': 443, 'tempeh': 445, 'citron': 450, 'yuzu': 450, 'mackerel': 451, 'pie dough': 457, 'wax bean': 457, 'doritos': 457, 'almond bark': 459, 'pastry shell': 460, 'clementine': 463, 'filet mignon': 467, 'dulce de leche': 467, 'orecchiette': 470, 'manicotti': 471, 'cornish hen': 474, 'toffee piece': 477, 'pastry dough': 480, 'ditalini': 481, 'frozen limeade concentrate': 483, 'double crust': 490, 'sorghum': 491, 'galangal': 493, 'italian salad dressing mix': 496, 'whey': 502, 'gnocchi': 503, 'splenda brown sugar blend': 503, 'pernod': 505, 'sourdough starter': 510, 'sardine': 511, 'courgette': 513, 'hen': 516, 'dipping sauce': 531, 'merlot': 534, 'croissant': 538, 'bean sauce': 544, 'quail': 547, 'rocket': 553, 'guava': 555, 'frangelico': 568, 'crepe': 572, 'boysenberry': 578, 'rabbit': 582, 'dried chipotle powder': 583, 'coating mix': 585, 'morel': 585, 'french dressing': 586, 'millet': 586, 'bratwurst': 586, 'crema': 588, 'alfalfa': 594, 'licorice': 598, 'pico de gallo': 600, 'cupcake': 605, 'sea bass': 608, 'oleo': 608, 'cooking sherry': 611, 'calvados': 615, 'tater tot': 616, 'diced pimento': 616, 'tamarind paste': 618, 'pepitas': 619, 'gherkin': 620, 'msg': 623, 'taco shell': 623, 'dream whip': 629, 'cheez whiz': 630, 'cold cut': 640, 'challah': 642, 'fresh ricotta': 642, 'meringue': 654, 'ground round': 664, 'chinese five spice powder': 664, 'fleur de sel': 666, 'mesclun': 669, 'thousand island dressing': 674, 'hummus': 678, 'bonito flake': 679, 'cheesecloth': 684, 'waffle': 685, 'soybean': 695, 'nam pla': 700, 'phyllo pastry': 710, 'shortbread': 711, 'harissa': 727, 'frisee': 740, 'cheesecake': 744, 'bouquet garni': 749, 'fryer': 753, 'aubergine': 758, 'kombu': 759, 'shiso': 764, 'eggnog': 769, 'caviar': 769, 'thai chile': 776, 'baking sheet': 778, 'sorbet': 779, 'swordfish': 785, 'cola': 787, 'sprite': 789, 'catalina dressing': 794, 'bagel': 795, 'sole': 808, 'parmigiano': 809, 'rutabaga': 819, 'masa harina': 824, 'crawfish': 828, 'haddock': 829, 'dal': 834, 'pea pod': 835, 'kirsch': 840, 'ravioli': 851, 'almond paste': 861, 'custard': 865, 'flounder': 871, 'curacao': 873, 'ladyfinger': 880, 'bicarbonate soda': 884, 'craisins': 885, 'mixed spice': 900, 'aluminum foil': 900, 'gingersnap': 900, 'dried ancho chile': 912, 'escarole': 915, 'sparerib': 921, 'black sesame seed': 933, 'sriracha sauce': 939, 'sambal oelek': 955, 'spelt': 958, 'bean paste': 959, 'batter': 962, 'hominy': 978, 'brine': 984, 'sherbet': 990, 'catfish': 1000, 'honeydew': 1003, 'original sauce': 1009, 'ribbon': 1028, 'toothpick': 1031, 'green grape': 1032, 'protein powder': 1043, 'queso fresco': 1048, 'soya sauce': 1048, 'taco sauce': 1054, 'plantain': 1057, 'pecan piece': 1058, 'artificial sweetener': 1096, 'matzo': 1119, 'fusilli': 1120, 'liquor': 1145, 'nectarine': 1153, 'herbes de provence': 1172, 'walnut piece': 1184, 'lavender': 1214, 'squid': 1217, 'trout': 1224, 'buffalo': 1227, 'hock': 1233, 'arrowroot': 1237, 'bamboo shoot': 1237, 'walnut half': 1241, 'phyllo dough': 1247, 'picante sauce': 1253, 'whole almond': 1253, 'nutella': 1261, 'edamame': 1269, 'tangerine': 1281, 'sultana': 1291, 'alfredo sauce': 1306, 'bulgur': 1313, 'red snapper': 1324, 'tilapia fillet': 1329, 'grit': 1331, 'consomme': 1346, 'jicama': 1346, 'yoghurt': 1355, 'wrap': 1356, 'stevia': 1358, 'venison': 1364, 'meatball': 1376, 'acorn': 1379, 'ciabatta': 1379, 'guacamole': 1404, 'xanthan gum': 1408, 'vermicelli': 1413, 'radicchio': 1434, 'semolina': 1453, 'poblano chile': 1465, 'grenadine': 1465, 'swiss chard': 1466, 'chervil': 1468, 'scotch': 1498, 'tortellini': 1522, 'nori': 1537, 'truffle': 1577, 'half half': 1592, 'wasabi': 1612, 'dried fruit': 1641, 'seaweed': 1655, 'endive': 1667, 'seafood': 1677, 'dripping': 1695, 'papaya': 1699, 'cantaloupe': 1715, 'colby': 1722, 'splenda granular': 1724, 'marinade': 1740, 'prawn': 1746, 'mace': 1757, 'toast': 1763, 'melon': 1774, 'great northern bean': 1782, 'mini chocolate chip': 1797, 'rose': 1801, 'schnapps': 1810, 'curd': 1824, 'marsala': 1839, 'saltine': 1848, 'pesto sauce': 1849, 'yam': 1851, 'kahlua': 1867, 'brownie': 1878, 'polenta': 1890, 'wonton': 1894, 'savory': 1928, 'capsicum': 1929, 'pectin': 1932, 'cacao': 1939, 'bok choy': 1964, 'teriyaki sauce': 1979, 'fresh herb': 2000, 'salami': 2003, 'liver': 2004, 'popcorn': 2007, 'cornbread': 2011, 'mixed salad green': 2017, 'ghee': 2020, 'chutney': 2026, 'kielbasa': 2027, 'coleslaw': 2046, 'okra': 2049, 'brisket': 2050, 'gorgonzola': 2054, 'string': 2057, 'habanero': 2061, 'katakuriko': 2064, 'triple sec': 2069, 'fudge': 2074, 'dashi': 2077, 'fontina': 2086, 'cornflour': 2093, 'cognac': 2152, 'grey poupon': 2161, 'glaze': 2187, 'halibut': 2195, 'brussels sprout': 2215, 'pizza crust': 2243, 'frank': 2255, 'pancake': 2271, 'tomatillo': 2281, 'gin': 2283, 'cranberry sauce': 2287, 'club soda': 2327, 'catsup': 2329, 'prune': 2334, 'amaretto': 2337, 'enchilada sauce': 2339, 'pimiento': 2342, 'mussel': 2348, 'macadamia': 2369, 'pimento': 2388, 'kiwi': 2400, 'grand marnier': 2414, 'bitter': 2464, 'blanched almond': 2481, 'baking mix': 2489, 'skewer': 2492, 'adobo sauce': 2494, 'gluten': 2513, 'watermelon': 2526, 'sauerkraut': 2536, 'marinara sauce': 2537, 'pizza sauce': 2632, 'hot dog': 2655, 'crouton': 2675, 'miso': 2675, 'duck': 2681, 'pretzel': 2692, 'lemongrass': 2693, 'tahini': 2709, 'ale': 2730, 'tapioca': 2733, 'pita bread': 2744, 'lard': 2753, 'whiskey': 2755, 'starch': 2809, 'soymilk': 2814, 'lobster': 2817, 'vermouth': 2820, 'rhubarb': 2825, 'marmalade': 2867, 'pizza dough': 2877, 'lemonade': 2937, 'fettuccine': 3001, 'hash brown': 3009, 'turnip': 3014, 'poultry': 3029, 'flavoring': 3039, 'mascarpone': 3054, 'muffin': 3084, 'champagne': 3102, 'watercress': 3102, 'peppermint': 3116, 'cod': 3137, 'casing': 3161, 'crisco': 3166, 'parsnip': 3174, 'rotel': 3175, 'pancetta': 3178, 'fig': 3185, 'bisquick': 3186, 'stuffing mix': 3189, 'pomegranate': 3242, 'hoisin sauce': 3261, 'pecan half': 3291, 'gravy': 3293, 'fresh raspberry': 3323, 'relish': 3351, 'paper': 3365, 'caraway seed': 3400, 'grapefruit': 3417, 'snow': 3424, 'cannellini': 3431, 'lasagna noodle': 3452, 'bran': 3467, 'tamari': 3474, 'pepperoni': 3482, 'linguine': 3491, 'tea': 3500, 'chipotle chile': 3519, 'couscous': 3520, 'tequila': 3536, 'barley': 3643, 'frosting': 3657, 'quinoa': 3691, 'poppy seed': 3719, 'creme fraiche': 3804, 'anise': 3933, 'cookie': 3954, 'agave': 3982, 'jelly': 4029, 'espresso': 4038, 'meal': 4091, 'maraschino cherry': 4122, 'kale': 4183, 'puff pastry': 4227, 'masala': 4228, 'pie shell': 4242, 'crab': 4268, 'bourbon': 4269, 'golden raisin': 4305, 'ranch dressing': 4355, 'gruyere': 4380, 'vinaigrette': 4413, 'scallop': 4529, 'currant': 4531, 'oatmeal': 4656, 'saffron': 4686, 'wafer': 4690, 'miracle whip': 4705, 'pistachio': 4720, 'prosciutto': 4729, 'mirin': 4766, 'baguette': 4890, 'beet': 5080, 'sprout': 5226, 'pie filling': 5245, 'veal': 5278, 'radish': 5301, 'chestnut': 5414, 'dry sherry': 5441, 'hazelnut': 5466, 'cashew': 5505, 'crabmeat': 5565, 'gingerroot': 5584, 'preserve': 5649, 'penne': 5658, 'marjoram': 5709, 'lentil': 5738, 'rom': 5759, 'sake': 5775, 'clam': 5851, 'caster': 5861, 'italian dressing': 5881, 'date': 5907, 'biscuit': 5922, 'caramel': 5928, 'sirloin': 6007, 'salad dressing': 6248, 'arugula': 6255, 'tabasco sauce': 6394, 'chuck': 6667, 'chickpea': 6809, 'pickle': 6911, 'icing': 6912, 'food coloring': 6918, 'horseradish': 6952, 'tenderloin': 7045, 'oyster': 7115, 'bun': 7441, 'barbecue sauce': 7501, 'hamburger': 7508, 'jam': 7513, 'berry': 7562, 'cauliflower': 7673, 'applesauce': 7689, 'vodka': 7777, 'tofu': 7908, 'cardamom': 8065, 'pie crust': 8078, 'pear': 8192, 'cereal': 8201, 'herb': 8283, 'artichoke': 8385, 'brandy': 8398, 'eggplant': 8479, 'tuna': 8669, 'macaroni': 8672, 'caper': 8997, 'boneless skinless chicken breast half': 9123, 'beer': 9148, 'grain': 9266, 'lamb': 9328, 'kidney bean': 9362, 'blackberry': 9653, 'mango': 9655, 'asparagus': 10008, 'tarragon': 10064, 'grape': 10265, 'anchovy': 10313, 'puree': 10537, 'marshmallow': 10610, 'molasses': 10624, 'whipped topping': 10635, 'fennel': 10703, 'leek': 10855, 'roast': 10921, 'spice': 11043, 'cool whip': 11252, 'gelatin': 11290, 'philadelphia': 11342, 'fruit': 11359, 'turmeric': 11392, 'liqueur': 11444, 'hot sauce': 11583, 'peppercorn': 11604, 'cornmeal': 11692, 'apricot': 11890, 'bouillon': 12013, 'roll': 12304, 'spaghetti': 12637, 'peach': 12667, 'salmon': 12673, 'feta': 12721, 'allspice': 13532, 'plum': 13576, 'sage': 13901, 'pudding': 14052, 'rum': 14061, 'squash': 14203, 'coffee': 14497, 'blueberry': 14515, 'meat': 14989, 'raspberry': 15082, 'salsa': 15627, 'fish': 15642, 'avocado': 16266, 'cooking spray': 16302, 'chile': 16412, 'cranberry': 16415, 'candy': 16737, 'ketchup': 17089, 'curry': 17156, 'liquid': 17180, 'noodle': 17390, 'rib': 17969, 'shortening': 18488, 'cabbage': 18541, 'pumpkin': 19040, 'cucumber': 19484, 'broccoli': 19516, 'ham': 19709, 'fillet': 20546, 'breadcrumb': 20778, 'chive': 20794, 'dill': 20994, 'zucchini': 21100, 'oat': 21447, 'yeast': 21606, 'raisin': 22119, 'steak': 22428, 'buttermilk': 22501, 'jar': 22539, 'coriander': 22720, 'cider': 22805, 'mint': 23416, 'cracker': 23580, 'turkey': 23749, 'rosemary': 23922, 'pea': 24259, 'tortilla': 24678, 'nut': 25039, 'lettuce': 25065, 'cherry': 25188, 'fat': 25381, 'shrimp': 25385, 'scallion': 25426, 'banana': 26001, 'sausage': 26308, 'cake': 26815, 'shallot': 27464, 'pineapple': 27818, 'jalapeno': 28332, 'cocoa': 28895, 'worcestershire sauce': 29432, 'pecan': 29617, 'yogurt': 29896, 'spinach': 30180, 'walnut': 30832, 'ice': 31950, 'cornstarch': 32793, 'wheat': 34128, 'sesame': 34613, 'paprika': 38308, 'soup': 39124, 'cayenne': 39198, 'syrup': 39844, 'nutmeg': 40623, 'peanut': 40872, 'coconut': 41330, 'pork': 41442, 'almond': 43259, 'mayonnaise': 43452, 'chip': 44282, 'bacon': 45570, 'stock': 45985, 'seasoning': 46715, 'oregano': 46724, 'margarine': 46886, 'stick': 47238, 'cumin': 48515, 'cilantro': 50118, 'honey': 51379, 'soy sauce': 52796, 'thyme': 53428, 'apple': 55397, 'strawberry': 57487, 'baking soda': 59180, 'chili': 59194, 'basil': 59973, 'corn': 60516, 'lime': 61167, 'bay leaf': 61299, 'seed': 62209, 'pasta': 62573, 'bread': 63111, 'ginger': 63398, 'bean': 65005, 'broth': 67490, 'mustard': 67950, 'celery': 68080, 'baking powder': 70199, 'carrot': 71200, 'mushroom': 71469, 'rice': 73357, 'orange': 76141, 'potato': 80794, 'beef': 84131, 'wine': 87033, 'chocolate': 90899, 'extract': 91403, 'cinnamon': 95289, 'parsley': 98134, 'vinegar': 105295, 'vegetable': 109144, 'vanilla': 158676, 'green': 160674, 'lemon': 172234, 'tomato': 190240, 'chicken': 193258, 'milk': 200993, 'juice': 211788, 'clove': 219141, 'water': 233927, 'olive': 243643, 'cream': 243669, 'flour': 281571, 'egg': 302727, 'garlic': 305879, 'cheese': 315124, 'butter': 356940, 'onion': 362011, 'oil': 402961, 'sugar': 464057, 'pepper': 561840, 'salt': 593043}
CPU times: user 48min 17s, sys: 1min 36s, total: 49min 53s
Wall time: 54min 46s
In [11]:
with open('./vocabulary/ingredients_vocabulary/ingredients_kaggleNature_frequency.json', 'w') as json_file:
    
    json.dump(od, json_file)

Kaggle&Nature

In [9]:
new_id_ingredients_cuisine_vectorized = {}

for index_recipe, recipe in enumerate(new_id_ingredients_cuisine):
    
    for ingredient in recipe["ingredients"]:
        
        new_id_ingredients_cuisine_vectorized[index_recipe] = recipe["ingredients"]

recipe_vector = {}
 
for recipe_id, ingredients in new_id_ingredients_cuisine_vectorized.items():
    
    for ingredient in ingredients:
        
        if ingredient in list(recipe_vector.keys()):
            
            recipe_vector[ingredient] = recipe_vector[ingredient] + 1
            
        else:
            
            recipe_vector[ingredient] = 1                  
In [10]:
od = {k: v for k, v in sorted(recipe_vector.items(), key=lambda item: item[1])}

print(od)
{'beech': 1, 'sturgeon caviar': 1, 'geranium': 1, 'pelargonium': 1, 'roasted nut': 1, 'muscat grape': 1, 'roasted pecan': 1, 'mate': 1, 'jasmine tea': 1, 'lilac flower oil': 1, 'angelica': 1, 'durian': 1, 'strawberry jam': 1, 'jamaican rum': 1, 'emmental cheese': 1, 'johnsonville andouille dinner sausage': 1, 'taiwanese bok choy': 1, 'membrillo': 1, 'chestnut flour': 1, 'chorizo spanish': 1, 'instant butterscotch pudding mix': 1, 'guinness lager': 1, 'frank hot sauce': 1, 'whole grain thin spaghetti': 1, 'blueberri preserv': 1, 'wish bone guacamol ranch dress': 1, 'light brown muscavado sugar': 1, 'liquorice': 1, 'old el paso mild red enchilada sauce': 1, 'italian style roll': 1, 'branzino fillet': 1, 'carbonated beverage': 1, 'yellowtail': 1, 'arame': 1, 'aged gouda': 1, 'annatto oil': 1, 'light margarine': 1, 'soy marinade': 1, 'spring mix': 1, 'baby beet': 1, 'romana': 1, 'gluten free cooking spray': 1, 'leftover gravy': 1, 'abbamele': 1, 'sablefish': 1, 'fiber one': 1, 'lillet': 1, 'xuxu': 1, 'sturgeon fillet': 1, 'duck dripping': 1, 'plain chocolate': 1, 'ragu old world style tradit pasta sauc': 1, 'progresso black bean': 1, 'garden cress': 1, 'long pasta': 1, 'cloud ear fungus': 1, 'bottled balsamic vinaigrette': 1, 'poppyseeds': 1, 'creole spice mix': 1, 'redfish fillet': 1, 'strip loin steak': 1, 'st germain liqueur': 1, 'zatarains jambalaya mix': 1, 'ground roasted sichuan pepper': 1, 'puy lentil': 1, 'dried prawn': 1, 'cured chorizo': 1, 'creole seasoning mix': 1, 'bass': 1, 'toasted nut': 1, 'splenda granular': 1, 'sobrasada': 1, 'peach syrup': 1, 'non dairy margarine': 1, 'ti leaf': 1, 'knorr parslei minicub': 1, 'soy glaze': 1, 'karo': 1, 'red drum': 1, 'mantou': 1, 'worcestershire sauce low sodium': 1, 'pekin duck breast half': 1, 'stolichnaya': 1, 'dandelion': 1, 'minute steak': 1, 'shiromiso': 1, 'fiddlehead fern': 1, 'oil packed anchovy': 1, 'poi': 1, 'banh hoi': 1, 'protein powder': 1, 'large snail': 1, 'bacardi mixer margarita mix': 1, 'bacardi superior': 1, 'blood sausage': 1, 'swiss steak': 1, 'margherita pepperoni': 1, 'soft shell clam': 1, 'shredded low fat sharp cheddar': 1, 'wagon wheel': 1, 'low sodium diced tomato': 1, 'nian gao': 1, 'marrons': 1, 'dark ale': 1, 'soy nut': 1, 'mo qua': 1, 'sweet white miso paste': 1, 'ocean perch': 1, 'caponata': 1, 'low fat reduced sodium pasta sauce': 1, 'perch fillet': 1, 'calabrese sausage': 1, 'pte brise': 1, 'gravlax': 1, 'chinese duck sauce': 1, 'sea bream': 1, 'reduced sodium refried bean': 1, 'cooked vegetable': 1, 'genoise': 1, 'haricot bean': 1, 'shark steak': 1, 'belacan': 1, 'scrod': 1, 'low sodium chili sauce': 1, 'sugar cane juice': 1, 'chile con queso': 1, 'saba': 1, 'masur dal': 1, 'fowl': 1, 'garland chrysanthemum': 1, 'redcurrant jelly': 1, 'large sausage casing': 1, 'kewra': 1, 'chocolate drink': 1, 'sandwich steak': 1, 'fuji apple': 1, 'old fashioned stone ground grit': 1, 'johnsonville hot n spicy brat': 1, 'chuck short rib': 1, 'prune juice': 1, 'vegetarian protein crumbles': 1, 'treviso': 1, 'claw': 1, 'hawaiian salt': 1, 'comice pear': 1, 'sweet soy': 1, 'maple flavored extract': 1, 'whole grain english muffin': 1, 'shoga': 1, 'new mexico chile pod': 1, 'peppadews': 1, 'rock cornish game hen': 1, 'pullman loaf': 1, 'gluten free baking powder': 1, 'nonhydrogenated margarine': 1, 'herbsaint': 1, 'sweet chorizo': 1, 'adobo purpose seasoning': 1, 'lambrusco': 1, 'barramundi fillet': 1, 'longaniza': 1, 'cauliflowerets': 1, 'candied citron peel': 1, 'dhaniya powder': 1, 'hidden valley original ranch spicy ranch dressing': 1, 'crusty loaf': 1, 'pasta wagon wheel': 1, 'frank': 1, 'seafood breader': 1, 'sparkling sangria tradicional': 1, 'champagne grape': 1, 'prepared coleslaw': 1, 'tallow': 1, 'kahlua liqueur': 1, 'asakusa nori': 1, 'organic granulated sugar': 1, 'satsuma juice': 1, 'estancia pinot noir': 1, 'poundcake': 1, 'purple grape': 1, 'low fat vegetarian chili bean': 1, 'salted roasted pecan': 1, 'grana': 1, 'sugarcane juice': 1, 'matcha': 1, 'gluten flour': 1, 'mild sausage': 1, 'fresh spinach leaf rins pat dry': 1, 'conimex wok olie': 1, 'conimex woksaus special vietnamese gember knoflook': 1, 'rape': 1, 'fresh flounder fillet': 1, 'dried arbol chile': 1, 'mini pepperoni slice': 1, 'india pale ale': 1, 'green soybean': 1, 'roasted chili paste': 1, 'morsel': 1, 'low sodium pinto bean': 1, 'seafood base': 1, 'america': 1, 'chilcostle chile': 1, 'johnsonville hot spicy breakfast link': 1, 'marshmallow vodka': 1, 'gluten free rolled oat': 1, 'blue curaao': 1, 'shaved chocolate': 1, 'reposado': 1, 'blackcurrant syrup': 1, 'johnsonville andouille fully cooked sausage': 1, 'red anjou pear': 1, 'preshred low fat mozzarella chees': 1, 'sweet sour stir fry sauce': 1, 'empanada wrapper': 1, 'ikura': 1, 'maifun': 1, 'freeze dried strawberry': 1, 'asian sweet chili sauce': 1, 'dried barberry': 1, 'double dark soi sauc': 1, 'kim chee': 1, 'sorghum molasses': 1, 'canned pea carrot': 1, 'foccacia': 1, 'robert mondavi fume blanc': 1, 'chinese wolfberries': 1, 'black mushroom': 1, 'cavenders greek seasoning': 1, 'bone': 1, 'ortega tostada shell': 1, 'sheepshead': 1, 'pimenton de la vera': 1, 'cooking salt': 1, 'low sodium low fat pasta sauce': 1, 'miso sesame grilling sauce': 1, 'cross rib roast': 1, '8 ounc ziti pasta cook drain': 1, 'elmlea single light': 1, 'flora buttery': 1, 'haloumi': 1, 'sauce mix': 1, 'chocolate leaf': 1, 'leftover steak': 1, 'low fat graham cracker crumb': 1, 'macarons': 1, 'low fat bottled italian dressing': 1, 'lapsang': 1, 'cuttlefish': 1, 'fine grain salt': 1, 'bertolli arrabbiata sauce': 1, 'crushed saltine': 1, 'wondra': 1, 'saki': 1, 'hillshire farm low fat sausage': 1, 'barbecue seasoning': 1, 'dumpling dough': 1, 'fresh date': 1, 'long green chilies': 1, 'scone': 1, 'royal olive': 1, 'san marzano diced tomato': 1, 'wish bone light italian dressing': 1, 'pot pie': 1, 'shoulder steak': 1, 'shortbread': 1, 'orchid': 1, 'tuscan sausage': 1, 'vegeta seasoning': 1, 'martha white cornbread mix': 1, 'food gel': 1, 'icing mix': 1, 'poured fondant': 1, 'ragu sauce': 1, 'ricard': 1, 'filipino eggplant': 1, 'cured meat': 1, 'fat free whipped topping': 1, 'brownie layer': 1, 'back rib': 1, 'wasabe': 1, 'reduced sodium garbanzo': 1, 'angled loofah': 1, 'tapatio hot sauce': 1, 'crabapple': 1, 'moose': 1, 'proscuitto di parma': 1, 'low sodium stock': 1, 'red chard': 1, 'whole grain spelt flour': 1, 'arepa flour': 1, 'prune puree': 1, 'burgundy snail': 1, 'rusk': 1, 'petrale sole': 1, 'kingfish': 1, 'accompaniment': 1, 'pound cake mix': 1, 'havarti': 1, 'spiny lobster': 1, 'ground hazelnut': 1, 'skinned boned duck breast half': 1, 'graviera': 1, 'marshmallow fluff': 1, 'mojo marinade': 1, 'pink salt': 1, 'refrigerated chocolate chip cookie dough': 1, 'san marzano crushed tomato': 1, 'bear': 1, 'falafel': 1, 'seafood glaze': 1, 'granita': 1, 'smoked bratwurst': 1, 'cabernet': 1, 'ciabatta bun': 1, 'chourico': 1, 'toasted sunflower seed': 1, 'cola flavored carbonated beverage': 1, 'energy drink': 1, 'velveeta queso blanco': 1, 'frozen mini ravioli': 1, 'cone': 1, 'chapatti flour': 1, 'portuguese roll': 1, 'elmlea single': 1, 'nam prik': 1, 'ranch dip': 1, 'knorr pasta side': 1, 'green pesto': 1, 'schnapps': 1, 'toulouse sausage': 1, 'goma': 1, 'panch phoran': 1, 'melted fat': 1, 'budweiser': 1, 'homemade stock': 1, 'pumpernickel': 1, 'flora proactiv': 1, 'agar agar flake': 1, 'cook drain pasta ziti': 1, 'chilled seltzer': 1, 'pam stick cooking spray': 1, 'jambon de bayonne': 1, 'aleppo': 1, 'hierba santa': 1, 'kampyo': 1, 'katsuo dashi': 1, 'maca powder': 1, 'tree ear': 1, 'ammonium bicarbonate': 1, 'crme de framboise': 1, 'wish bone': 1, 'mineral water': 1, 'awase miso': 1, 'ascorbic acid': 1, 'saltpeter': 1, 'dried oyster': 1, 'eye round': 1, 'shelled hemp seed': 1, 'pancit bihon': 1, 'fern': 1, 'veggie patty': 1, 'pernod liqueur': 1, 'nigari tofu': 1, 'smoked rasher': 1, 'jose cuervo': 1, 'bertolli organic tradit sauc': 1, 'quorn chikn tender': 1, 'pastry tart shell': 1, 'italian pizza crust': 1, 'extra firm silken tofu': 1, 'bob evans italian sausage': 1, 'calorie sweetener': 1, 'small potato': 1, 'whole garam masala': 1, 'butternut': 1, 'boursin': 1, 'acai juice': 1, 'chocolate cookie crumb': 1, 'tamari tamari': 1, 'basa fillet': 1, 'turbot fillet': 1, 'low fat salad dressing': 1, 'psyllium husk': 1, 'teff': 1, 'masago': 1, 'yellowfin': 1, 'superfine white sugar': 1, 'amberjack fillet': 1, 'green giant sliced mushroom': 1, 'soya flour': 1, 'lady house seasoning': 1, 'skinless flounder fillet': 1, 'clementine section': 1, 'chuck tender': 1, 'margarine spread': 1, 'pain au levain': 1, 'mae ploy sweet chili sauce': 1, 'pane di casa': 1, 'multi grain penne pasta': 1, 'royal baking powder': 1, 'lap cheong': 1, 'kumquat syrup': 1, 'dried allspice berry': 1, 'soup bone': 1, 'granulated tapioca': 1, 'ragu classic alfredo sauce': 1, 'ragu golden veggie fettuccine pasta': 1, 'flora original': 1, 'shank half': 1, 'dried tagliatelle': 1, 'low fat white sauce': 1, 'mora chile': 1, 'mazola canola oil': 1, 'seasoned crouton': 1, 'light kidney bean': 1, 'waffle fry': 1, 'jamaican jerk rub': 1, 'fisher pecan': 1, 'tuaca': 1, 'mooli': 1, 'btarde': 1, 'uni': 1, 'new york style panetini toast': 1, 'whole grain roll': 1, 'pangasius': 1, 'lesser galangal': 1, 'plain seltzer': 1, 'shiraz': 1, 'sesame seed bun': 1, 'hamachi fillet': 1, 'ragu robusto pasta sauce': 1, 'white quinoa': 1, 'smoked mozzarella': 1, 'pink food coloring': 1, 'bai cai': 1, 'soft roll': 1, 'chimichurri': 1, 'boneless moulard duck breast half': 1, 'kielbasa low fat': 1, 'habanero powder': 1, 'kroger black bean': 1, 'chocolate stick': 1, 'habas': 1, 'salted roasted almond': 1, 'tamari almond': 1, 'creamy gravy': 1, 'morcilla': 1, 'petits poi': 1, 'jamaican jerk marinade': 1, 'imperial sugar light brown sugar': 1, 'italian sauce': 1, 'crisco pure canola oil': 1, 'chile colorado': 1, 'earth balance natural buttery spread': 1, 'bone short rib': 1, 'nashi': 1, 'sucralose sweetener': 1, 'adobo style seasoning': 1, 'breakfast sausage link': 1, 'seville orange': 1, 'turtle': 1, 'dry fettuccine': 1, 'english walnut': 1, 'goose': 1, 'cassis liqueur': 1, 'chinese jujube': 1, 'sweetened red bean': 1, 'pancake batter': 1, 'dried hibiscus blossom': 1, 'low fat feta': 1, 'duck sauce': 1, 'rotel diced tomato green chilies': 1, 'earth balance buttery spread': 1, 'boneless chop': 1, 'quorn crumbles': 1, 'essence seasoning': 1, 'boy choy': 1, 'kamut flour': 1, 'chinese bun': 1, 'hamachi': 1, 'johnsonville hot spicy sausage slice': 1, 'dasheen': 1, 'ragu cheesi doubl cheddar sauc': 1, 'chicharron': 1, 'cooked fettuccini': 1, 'blackpepper': 1, 'store bought pound cake': 1, 'bagel chip': 1, 'jamaican jerk': 1, 'cornstarch noodle': 1, 'greek style seasoning': 1, 'frozen potato': 1, 'hoagi roll': 1, 'candied jalapeno': 1, 'soy vay toasted sesame dressing marinade': 1, 'bordelaise sauce': 1, 'sport drink': 1, 'herb dressing': 1, 'au jus gravy': 1, 'maraschino': 1, 'green fig': 1, 'tuttorosso diced tomato': 1, 'semisweet chocolate chunk': 1, 'domino confectioner sugar': 1, 'pansy': 1, 'chocolatecovered espresso bean': 1, 'burger style crumbles': 1, 'wish bone light country italian dressing': 1, 'alexia waffle fry': 1, 'shishito chile': 1, 'custard dessert mix': 1, 'mr dash seasoning mix': 1, 'tipo 00 flour': 1, 'heinz ketchup': 1, 'guacamole seasoning mix': 1, 'sazon goya': 1, 'lingcod': 1, 'granular calorie sucralose sweetener': 1, 'korean vermicelli': 1, 'ragu pizza quick sauc': 1, 'pina colada mix': 1, 'vadouvan curry': 1, 'longan': 1, 'table syrup': 1, 'water cracker': 1, 'low fat balsamic vinaigrette': 1, 'roasted bell pepper': 1, 'branston pickle': 1, 'glucose syrup': 1, 'bran flake': 1, 'sliced beet': 1, 'wing sauce': 1, 'chopmeat': 1, 'biga': 1, 'cardoon': 1, 'fillet medallion': 1, 'torpedo roll': 1, 'greek black olive': 1, 'long bun': 1, 'truva natural sweetener': 1, 'reduced sodium kidney bean': 1, 'dark soy': 1, 'kappa': 1, 'japanese peanut': 1, 'artificial sweetener': 1, 'dried strawberry': 1, 'demi baguette': 1, 'fried wonton strip': 1, 'ibarra chocolate': 1, 'standing rib roast': 1, 'bndictine': 1, 'smoked hog jowl': 1, 'skinless mahi mahi fillet': 1, 'house seasoning': 1, 'boneless magret duck breast half': 1, 'blacan': 1, 'topside steak': 1, 'marrons glacs': 1, 'extra': 1, 'padron pepper': 1, 'farfalline': 1, 'pillsbury crescent recipe creation refrigerated seamless dough sheet': 1, 'mesquite flavored seasoning mix': 1, 'low fat crme frache': 1, 'stellette': 1, 'chiltepn': 1, 'cake mix white yellow': 1, 'creamed spinach': 1, 'crumpet': 1, 'boned skinned duck breast half': 1, 'yoghurt natural low fat': 1, 'lapsang souchong': 1, 'smoked chorizo': 1, 'limeade': 1, 'muscovy': 1, 'caramel flavored syrup': 1, 'azteca flour tortilla': 1, 'kraft original barbecue sauce': 1, 'thick curd': 1, 'century egg': 1, 'sparkling lemonade': 1, 'low sodium cajun seasoning': 1, 'louisiana cajun seasoning': 1, 'dark lager': 1, 'asian': 1, 'powdered sugar icing': 1, 'hellmann best food canola cholesterol free mayonnais': 1, 'harusame': 1, 'heinz worcestershire sauce': 1, 'v 8 juice': 1, 'kipper': 1, 'balm leaf': 1, 'sour salt': 1, 'venison steak': 1, 'flaked oat': 1, 'vindaloo paste': 1, 'absinthe': 1, 'mountain dew soda': 1, 'tony chacheres seasoning': 1, 'mincemeat pie filling': 1, 'vegan bouillon cube': 1, 'galliano': 1, '2 low fat cheddar chees': 1, 'venison roast': 1, 'tart crust': 1, 'shredded bamboo': 1, 'pointed pepper': 1, 'gluten free pie crust': 1, 'wholesome sweetener organic sugar': 1, 'fine grind white cornmeal': 1, 'pillsbury thin pizza crust': 1, 'semisweet vegan chocolate chip': 1, 'gluten free lasagna noodle': 1, 'gluten free marinara sauce': 1, 'chocolate candy': 1, 'sweet pickle juice': 1, 'strip loin': 1, 'long green': 1, 'raw peeled prawn': 1, 'barilla linguine': 1, 'v8 juice': 1, 'burrito seasoning mix': 1, 'curry guy smoked garam masala': 1, 'refrigerated dinner roll': 1, 'dried cloud ear': 1, 'daikon sprout': 1, 'delallo penne ziti': 1, 'refrigerated seamless crescent dough': 1, 'laksa paste': 1, 'smoked whitefish': 1, 'cappuccino': 1, 'snap': 1, 'hen': 1, 'purple potato': 1, 'camellia red kidney bean': 1, 'low fat tartar sauce': 1, 'dulong': 1, 'fideos pasta': 1, 'gomashio': 1, 'fruitcake': 1, 'sweet biscuit crumb': 1, 'hen wood': 1, 'quahog clam': 1, 'genmai miso': 1, 'cipollini': 1, 'mousse': 1, 'licor 43': 1, 'warm bun': 1, 'amba': 1, 'chambord liqueur': 1, 'lox': 1, 'tangelo': 1, 'queso crema': 1, 'chocolate chip cookie mix': 1, 'pam cooking spray': 1, 'crabmeat frozen': 1, 'cake pound prepar': 1, 'hyssop': 1, 'melissa': 1, 'fresh white truffle': 1, 'smart balance cooking spray': 1, 'chocolate frosting': 1, 'asti spumante': 1, 'nama shoyu': 1, 'unsweetened baking chocolate': 1, 'ngo gai': 1, 'ready made pie crust': 1, 'calabash': 1, 'jamon serrano': 1, 'double crust': 1, 'lady apple': 1, 'instant oat': 1, 'smoked almond': 1, 'creole seafood seasoning': 1, 'chunky style pasta sauce': 1, 'suckling pig': 1, 'clementine juice': 1, 'moonshine': 1, 'low fat part skim ricotta chees': 1, 'kochu chang': 1, 'blanco chees queso': 1, 'pure wesson canola oil': 1, 'legume': 1, 'mezzetta sliced greek kalamata olive': 1, 'frozen garden pea': 1, 'burger roll': 1, 'low fat monterey jack': 1, 'shredded low fat cheddar': 1, 'peapods': 1, 'reduced sodium italian style stewed tomato': 1, 'hots': 1, 'la victoria red chile sauce': 1, 'lean chuck roast': 1, 'scape pesto': 1, 'riso': 1, 'mixed frozen seafood': 1, 'dangmyun': 1, 'cajun remoulade': 1, 'jumbo shell pasta cook drain': 1, 'hake fillet': 1, 'nonfat italian dressing': 1, 'angus': 1, 'duck bone': 1, 'young leek': 1, 'soup pasta': 1, 'kraft mayonnaise': 1, 'italian vinaigrette': 1, 'branca menta': 1, 'frozen cherry': 1, 'dipping chocolate': 1, 'ground nut': 1, 'fil': 1, 'chocolate graham cracker crumb': 1, 'heath candy bar': 1, 'cubed pancetta': 1, 'gebhardt chili powder': 1, 'calamari steak': 1, 'vodka sauce': 1, 'medium potato': 1, 'pareve margarine': 1, 'sherbet': 1, 'frozen mashed potato': 1, 'yellow heirloom tomato': 1, 'val': 1, 'assam': 1, 'fryer': 1, 'candied chestnut': 1, 'dried rigatoni': 1, 'salted pistachio': 1, 'pancit': 1, 'lecithin': 1, 'mahlab': 1, 'nondairy whipped topping': 1, 'old el paso green chile': 1, 'porter': 1, 'red currant': 1, 'truva baking blend': 1, 'chrysanthemum': 1, 'salted anchovy': 1, 'sangiovese': 1, 'sichuan peppercorn oil': 1, 'fudge cake mix': 1, 'fat free crouton': 1, 'praline syrup': 1, 'salt free herb seasoning': 1, 'coleslaw dressing': 1, 'everglades seasoning': 1, 'yellowtail snapper fillet': 1, 'chile piquin': 1, 'mini banana': 1, 'fedelini': 1, 'cornbread crumb': 1, 'cooked beetroot': 1, 'baby goat': 1, 'castelvetrano olive': 1, 'breadcrumb mix': 1, 'cactus': 1, 'goya hot sauce': 1, 'boneless steak': 1, 'bigoli': 1, 'red quinoa': 1, 'cucuzza': 1, 'italian seasoned diced tomato': 1, 'sugar pearl': 1, 'sunflower kernel': 1, 'verjuice': 1, 'unhulled sesame seed': 1, 'peeled canned low sodium tomato': 1, 'sirloin tip steak': 1, 'white zinfandel': 1, 'sturgeon': 1, 'red velvet cake mix': 1, 'dole seven lettuce': 1, 'wiener': 1, 'butterscotch filling': 1, 'jimmy': 1, 'kha': 1, 'pillsbury classic pizza crust': 1, 'black sea bass': 1, 'bottled low sodium salsa': 1, 'muscadet': 1, 'asian dressing': 1, 'tart filling': 1, 'tuong': 1, 'gluten free barbecue sauce': 1, 'rub seasoning': 1, 'tangzhong roux': 1, 'creamer potato': 1, 'low fat firm silken tofu': 1, 'tiger lily bud': 1, 'lo bok': 1, 'whole grain bun': 1, 'diced mushroom': 1, 'curry sauce mix': 1, 'baking sugar': 1, 'salt free cajun creole seasoning': 1, 'black cherry': 1, 'soy crumbles': 1, 'kim crawford sauvignon blanc': 1, 'bourbon liqueur': 1, 'gluten free penne': 1, 'sourdough roll': 1, 'arak': 1, 'tubettini': 1, 'amarena cherry': 1, 'dry jack': 1, 'slider roll': 1, 'gluten free broth': 1, 'ic pop': 1, 'jerk seasoning mix': 1, 'sugar raw': 1, 'crouton italian season': 1, 'irish oat': 1, 'zatarains creole seasoning': 1, 'tuaca liqueur': 1, 'italian roll': 1, 'mccormick taco seasoning': 1, 'water chestnut powder': 1, 'chioggia': 1, 'jambalaya': 1, 'new mexico red chile powder': 1, 'boquerones': 1, 'treviso radicchio': 1, 'black grape': 1, 'elderflower cordial': 1, 'tater tot': 1, 'matzo cake meal': 1, 'pizza seasoning': 1, 'pippin apple': 1, 'pandan essence': 1, 'seasoning rub': 1, 'liquid sweetener': 1, 'country gravy': 1, 'nonfat half half': 1, 'chocolate liqueur': 1, 'swiss': 1, 'spot prawn': 1, 'barilla piccolini mini': 1, 'hachiya': 1, 'yoplait': 1, 'grain alcohol': 1, 'praline': 1, 'pita wrap': 1, 'semi sweet mini chocolate chip': 1, 'peeled diced tomato': 1, 'french style sandwich roll': 1, 'liverwurst': 1, 'chua': 1, 'mian': 1, 'eggnog': 1, 'low fat caesar dressing': 1, 'pillsbury pie crust': 1, 'eye steak': 1, 'brill': 1, 'samphire': 1, 'brown sauce': 1, 'guanabana': 1, 'mellow white miso': 1, 'low fat coleslaw dressing': 1, 'hijiki': 1, 'cannelloni': 1, 'ogura': 1, 'chowchow': 1, 'hogue cabernet sauvignon': 1, 'steak tip': 1, 'ton skin': 1, 'paprika paste': 1, 'gnocchetti sardi': 1, 'chestnut spread': 1, 'tri tip steak': 1, 'jerk rub seasoning': 1, 'tandoori masala mix': 1, 'small shell': 1, 'speck': 1, 'blood': 1, 'miswa': 1, 'brown beech mushroom': 1, 'minced lean steak': 1, 'framboise liqueur': 1, 'frozen sweetened raspberry': 1, 'herdez salsa': 1, 'poolish': 1, 'wish bone robusto italian dressing': 1, 'frozen seafood': 1, 'gluten free tamari sauce': 1, 'langoustine': 1, 'prosciutto fat': 1, 'dip mix': 1, 'spinach tortilla': 1, 'reduced sugar ketchup': 1, 'tomate verde': 1, 'dried neem leaf': 1, 'glucose': 1, 'dried shallot': 1, 'chateaubriand': 1, 'mentaiko': 1, 'crushed peppercorn': 1, 'toasted bun': 1, 'arhar': 1, 'borlotti': 1, 'savoy spinach': 1, 'roasted pepitas': 1, 'proscuitto': 1, 'low fat shred cheddar chees sharp varieti': 1, 'cortland apple': 1, 'homemade meatball': 1, 'madeleine': 1, 'taco bell home original taco seasoning mix': 1, 'ratatouille': 1, 'shark': 1, 'whole grain rotini': 1, 'george dickel': 1, 'baked pita chip': 1, 'hidden valley farmhouse original italian herb dressing': 1, 'spicy mayonnaise': 1, 'panela': 1, 'graham flour': 1, 'drum': 1, 'raki': 1, 'fingerling': 1, 'greek seasoning mix': 1, 'hoja santa': 1, 'hakusai': 1, 'linguisa': 1, 'hot pepperoni': 1, 'orgeat syrup': 1, 'citric acid powder': 1, 'italian meatball': 1, 'honeycomb tripe': 1, 'nori furikake': 1, 'puff pastry cup': 1, 'wensleydale': 1, 'caramel syrup': 1, 'unsalted pecan': 1, 'doritos tortilla chip': 1, 'progresso diced tomato': 1, 'winesap': 1, 'friselle': 1, 'aquavit': 1, 'sato imo': 1, 'jagermeister liqueur': 1, 'lotus leaf': 1, 'crosswise': 1, 'skinless snapper fillet': 1, 'pike': 1, 'hot fudge topping': 1, 'matzo': 1, 'young nettle': 1, 'salt added canned tomato': 1, 'green bellpepper': 1, 'ramen noodle soup': 1, 'imitation seafood': 1, 'soft margarine': 1, 'granular sucrolose sweetener': 1, 'whipped dessert topping': 1, 'ragu traditional sauce': 1, 'soy based liquid seasoning': 1, 'boneless duck breast half': 1, 'classico pasta sauce': 1, 'tortelloni': 1, 'manischewitz matzo meal': 1, 'arctic char': 1, 'sandwich wrap': 1, 'aloe juice': 1, 'chartreuse liqueur': 1, 'tonic water': 1, 'salt free chili powder': 1, 'spicy salami': 1, 'chocolate extract': 1, 'chocolate graham cracker': 1, 'cumberland sausage': 1, 'chunky tomato': 1, 'manouri': 1, 'bone ribeye steak': 1, 'frozen lemonade concentrate thawed undiluted': 1, 'flowering chinese chive': 1, 'praline topping': 1, 'riblets': 1, 'puff paste': 1, 'barilla plus pasta': 1, 'conchiglie': 1, 'maker mark whisky': 1, 'knorr pasta side cheesi cheddar': 1, 'whole grain baguette': 1, 'ranch style seasoning': 1, 'ketjap': 1, 'chocolate flavored liqueur': 1, 'rotini pasta cook drain': 1, 'game': 1, 'tongue': 1, 'daiya': 1, 'curry mix': 1, 'oscar mayer cotto salami': 1, 'ciabatta loaf': 1, 'lop chong': 1, 'red algae': 2, 'raw beef': 2, 'laurel': 2, 'soybean oil': 2, 'holy basil': 2, 'pimenta': 2, 'sheep cheese': 2, 'strawberry juice': 2, 'hibiscus': 2, 'myzithra': 2, 'kashmiri chile': 2, 'karashi': 2, 'mini cucumber': 2, 'erythritol': 2, 'sesame salt': 2, 'pasta rotel': 2, 'hellmanns light mayonnaise': 2, 'food paste color': 2, 'castellane': 2, 'gluten free blend': 2, 'roquefort': 2, 'whole snapper': 2, 'veget soup mix': 2, 'silver dragee': 2, 'turbot': 2, 'sack': 2, 'pandan extract': 2, 'angel food cake mix': 2, 'spring green': 2, 'duck stock': 2, '10 oz frozen chopped spinach thawed squeezed dry': 2, 'poire williams': 2, 'cannelloni shell': 2, 'saltine crumb': 2, 'breast half': 2, 'coarse grain salt': 2, 'nori flake': 2, 'alcohol': 2, 'flat cut': 2, 'prime rib': 2, 'grated parmesan romano': 2, 'fresh chorizo': 2, 'black trumpet mushroom': 2, 'e fu noodl': 2, 'ground bison': 2, 'comino': 2, 'dried cascabel chile': 2, 'komatsuna': 2, 'pinot blanc': 2, 'minced peperoncini': 2, 'teleme': 2, 'tarama': 2, 'red serrano pepper': 2, 'chitterlings': 2, 'teardrop tomato': 2, 'shungiku': 2, 'cooked brisket': 2, 'pepperocini': 2, 'small egg': 2, 'ox tongue': 2, 'tart cherry': 2, 'skate wing': 2, 'beau monde seasoning': 2, 'salsify': 2, 'fresh tofu': 2, 'bouillon granule': 2, 'cuttlefish ball': 2, 'dillweed': 2, 'abalone': 2, 'linguine cook drain': 2, 'pie crust mix': 2, 'coke zero': 2, 'high gluten flour': 2, 'gluten free pasta': 2, 'gumbo': 2, 'paratha': 2, 'hidden valley original ranch dip mix': 2, 'steak fillet': 2, 'sorghum': 2, 'caciocavallo': 2, 'huitlacoche': 2, 'crushed pretzel': 2, 'red bartlett pear': 2, 'korma paste': 2, 'whole peel tomato undrain chop': 2, 'semi firm tofu': 2, 'chocolate mousse': 2, 'miniature chocolate chip': 2, 'asian barbecue sauce': 2, 'chile verde': 2, 'grated kefalotiri': 2, 'bottom round': 2, 'tomato vine': 2, 'potato obrien': 2, 'low fat cheddar': 2, 'best food real mayonnaise': 2, 'savoiardi': 2, 'amaranth': 2, 'collard leaf': 2, 'bbq seasoning': 2, 'sliced chorizo': 2, 'mini mm': 2, 'canned chipotle': 2, 'guinea hen': 2, 'barilla oven ready lasagne': 2, 'coulis': 2, 'sugarcane': 2, 'roti': 2, 'baby radish': 2, 'pitted cherry': 2, 'french toast': 2, 'limeade concentrate': 2, 'broiler': 2, 'katsuo bushi': 2, 'pastis': 2, 'pig trotter': 2, 'french sandwich roll': 2, 'heeng': 2, 'curry guy smoked spicy salt': 2, 'unsalted almond': 2, 'salt water': 2, 'sangria': 2, 'redfish': 2, 'mexican cooking sauce': 2, 'pearl tapioca': 2, 'lotus seed': 2, 'dukkah': 2, 'bologna': 2, 'link': 2, 'accent': 2, 'reduced fat ranch dressing': 2, 'black pudding': 2, 'razor clam': 2, 'muesli': 2, 'indian spice': 2, 'ficelle': 2, 'kirschwasser': 2, 'pale ale': 2, 'szechuan sauce': 2, 'microgreens': 2, 'sugarcane stick': 2, 'anasazi bean': 2, 'beaujolais': 2, 'hidden valley original ranch salad dressing seasoning mix': 2, 'graham cracker pie crust': 2, 'soursop': 2, 'dumpling skin': 2, 'pickling liquid': 2, 'textured soy protein': 2, 'tropical fruit': 2, 'praline liqueur': 2, 'green chard': 2, 'chocolate spread': 2, 'carpaccio': 2, 'pisco': 2, 'godiva chocolate liqueur': 2, 'gluten free breadcrumb': 2, 'knorr pasta side alfredo': 2, 'borage': 2, 'cooked italian meatball': 2, 'shell steak': 2, 'low sodium garbanzo bean': 2, 'gram dal': 2, 'fresh brussels sprout': 2, 'lady finger': 2, 'glace de viande': 2, 'canned jalapeno pepper': 2, 'papalo': 2, 'au jus mix': 2, 'alfredo sauce mix': 2, 'blade steak': 2, 'rockfish': 2, 'queso manchego': 2, 'refined sugar': 2, 'tofu puff': 2, 'mi': 2, 'nacho chip': 2, 'chocolate chunk': 2, 'mizkan oigatsuo tsuyu soup base': 2, 'bihon': 2, 'soft sandwich roll': 2, 'toffee sauce': 2, 'conch': 2, 'long green bean': 2, 'blackstrap molasses': 2, 'crumb crust': 2, 'spanish olive': 2, 'bee pollen': 2, 'small tomato': 2, 'dark miso': 2, 'low fat tortilla chip': 2, 'kalamansi juice': 2, 'boned duck breast half': 2, 'char': 2, 'italian style meatball': 2, 'cooked steak': 2, 'bottom round roast': 2, 'southern comfort liqueur': 2, 'strip steak': 2, 'fructose': 2, 'dried mission fig': 2, 'nonpareil': 2, 'greek dressing': 2, 'duckling': 2, 'filo': 2, 'keema': 2, 'southwest seasoning': 2, 'low sodium salt': 2, 'brazil nut': 2, 'shortcake': 2, 'soy chorizo': 2, 'stonefire italian artisan pizza crust': 2, 'mole poblano': 2, 'pignolis': 2, 'kokum': 2, 'pompano fillet': 2, 'yuzukosho': 2, 'pollock': 2, 'amber': 2, 'chrysanthemum leaf': 2, 'soup mix': 2, 'mochi': 2, 'foie gras terrine': 2, 'low fat baked tortilla chip': 2, 'frozen petit poi': 2, 'ibarra': 2, 'pickle wedge': 2, 'bhaji': 2, 'frangipane': 2, 'nori paper': 2, 'bertolli four chees rosa sauc': 2, 'hot chocolate mix': 2, 'ramen soup mix': 2, 'instant pudding mix': 2, 'reduced fat italian dressing': 2, 'bacardi': 2, 'pudding powder': 2, 'aspic': 2, 'frog leg': 2, 'jerk paste': 2, 'black moss': 2, 'candy cane': 2, 'red sockeye': 2, 'moroccan seasoning': 2, 'traditional italian sauce': 2, 'tobiko': 2, 'rennet': 2, 'dried tomato': 2, 'morton salt': 2, 'sparkling mineral water': 2, 'reduced sodium teriyaki sauce': 2, 'jamaican curry powder': 2, 'tree ear mushroom': 2, 'peach light syrup': 2, 'cabrales': 2, 'herb seasoned stuffing': 2, 'yellow pea': 2, 'red mullet': 2, 'sugar cookie dough': 2, 'tikka masala curry paste': 2, 'chinese chili paste': 2, 'thickener': 2, 'capon': 2, 'culantro': 2, 'carambola': 2, 'jamaica': 2, 'herb seasoned stuffing mix': 2, 'pastina': 2, 'finger chili': 2, 'reduced fat whipped topping': 2, 'rigatoni large tube pasta': 2, 'dried chestnut': 2, 'bouillon powder': 2, 'yaki nori': 2, 'tagliarini': 2, 'stewing steak': 2, 'buffalo': 2, 'snapper head': 2, 'stonefire italian thin pizza crust': 2, 'bitter gourd': 2, 'gingersnap cookie crumb': 2, 'sour mix': 2, 'flan': 2, 'dried sardine': 2, 'mentsuyu': 2, 'pickle spear': 2, 'precooked meatball': 2, 'toast point': 2, 'knoblauch': 2, 'canola oil cooking spray': 2, 'triscuits': 2, 'cajun seasoning mix': 2, 'piquillo pepper': 2, 'cummin': 2, 'country crock calcium plus vitamin': 2, 'brown gravy': 2, 'fillet steak': 2, 'poussin': 2, 'chocolate sandwich cooky': 2, 'karo syrup': 2, 'texas pete hot sauce': 2, 'frozen blackberry': 2, 'baby tatsoi': 2, 'quick cooking hominy grit': 2, 'light agave nectar': 2, 'doubanjiang': 2, 'mostarda': 2, 'robiola': 2, 'semi pearled farro': 2, 'queso fresca': 2, 'frozen brussels sprout': 2, 'gumbo file powder': 2, 'montreal steak seasoning': 2, 'balsamic vinaigrette salad dressing': 2, 'unbaked pie shell': 2, 'cava': 2, 'sweet baking chocolate': 2, 'lavash': 2, 'fresh masa': 2, 'bottled italian dressing': 2, 'tricolor quinoa': 2, 'natural sugar': 2, 'sucanat': 2, 'cole slaw mix': 2, 'baby artichoke': 2, 'bresaola': 2, 'devil food cake mix': 2, 'johnsonville mild italian ground sausage': 2, 'soft bun': 2, 'pepperidge farm puff pastry sheet': 2, 'rooster': 2, 'chilean sea bass fillet': 2, 'diamond crystal kosher salt': 2, 'bottled chili sauce': 2, 'condensed soup': 2, 'kasu': 2, 'salted mixed nut': 2, 'tvp': 2, 'gravy granule': 2, 'piri piri sauce': 2, 'dried bonito': 2, 'paccheri': 2, 'unsulphured molasses': 2, 'crme de menthe': 2, 'tartlet shell': 2, 'muenster': 2, 'giant white bean': 2, 'greater galangal': 2, 'regular sugar': 2, 'crescent dinner roll': 2, 'stevia powder': 2, 'canned bean': 2, 'pasta shape': 2, 'aonori': 2, 'chuno sauce': 2, 'spanish smoked paprika': 2, 'tostitos': 2, 'scrod fillet': 2, 'gravy master': 2, 'char fillet': 2, 'kabuli channa': 2, 'marcona almond': 2, 'kung pao sauce': 2, 'breadfruit': 2, 'top loin steak': 2, 'cipollini onion': 2, 'arrowroot flour': 2, 'hot spanish paprika': 2, 'bone marrow': 2, 'swede': 2, 'raclette': 2, 'pummelo': 2, 'zaatar': 2, 'wheatberries': 2, 'salt free seasoning': 2, 'rotel pasta cook drain': 2, 'grained': 2, 'preserv raspberri seedless': 2, 'filling': 2, 'toffee bit': 2, 'chopped potato': 2, 'pancit canton': 2, 'butterscotch sauce': 2, 'hing powder': 2, 'wolf brand chili': 2, 'bittersweet baking chocolate': 2, 'disco empanada frozen': 2, 'katakuriko': 2, 'sweetbread': 2, 'hong kong style noodle': 2, 'low sodium broth': 2, 'v8': 2, 'gluten free cornmeal': 2, 'ground peppercorn': 2, 'alum': 2, 'chile puree': 2, 'light lager': 2, 'cajun creole seasoning mix': 2, 'ground espresso': 2, 'boneless duck breast': 2, 'teriyaki marinade': 2, 'green chile sauce': 2, 'ramen noodle seasoning': 2, 'cremini': 2, 'alphabet pasta': 2, 'hoja santa leaf': 2, 'breast': 2, 'sub roll': 2, 'barolo': 2, 'shoulder roast': 2, 'roasting hen': 2, 'white baking bar': 2, 'low sodium crushed tomato': 2, 'salt free southwest chipotle seasoning': 2, 'pilsner': 2, 'muscadine grape': 2, 'rustic rub': 2, 'edamame bean': 2, 'tikka paste': 2, 'manzanilla olive': 2, 'hungarian hot paprika': 2, 'japanese mayonnaise': 2, 'meringue powder': 2, 'fresh curry': 2, 'au jus gravy mix': 2, 'frozen ravioli': 2, 'reblochon': 2, 'irish red ale': 2, 'sago pearl': 2, 'flavored tortilla chip': 2, 'gluten free spaghetti': 2, 'taco bell thick chunky mild salsa': 2, 'bone steak': 2, 'mm candy': 2, 'beurre mani': 2, 'buffalo mozarella': 2, 'tatsoi': 2, 'boysenberry': 2, 'chuka soba noodle': 2, 'shanghai bok choy': 2, 'baby turnip': 2, 'cold meatloaf': 2, 'white lily flour': 2, 'mesquite seasoning': 2, 'kitchen bouquet': 2, 'tortellini cook drain': 2, 'mahimahi fillet': 2, 'wonton noodle': 2, 'sunchoke': 2, 'pancetta slice': 2, 'goya sazon': 2, 'hidden valley original ranch light dressing': 2, 'oil packed dried tomato': 2, 'carp': 2, 'chili con carne': 2, 'chamomile': 3, 'rapeseed': 3, 'fuyu persimmon': 3, 'caul fat': 3, 'english muffin split toasted': 3, 'frozen broad bean': 3, 'baking apple': 3, 'cactus pad': 3, 'margarita salt': 3, 'torn romain lettuc leav': 3, 'roasted salted cashew': 3, 'hoagie bun': 3, 'gluten free hoisin sauce': 3, 'greek feta': 3, 'bagel': 3, 'red raspberry': 3, 'chipotle puree': 3, 'tahini paste': 3, 'salad leaf': 3, 'crusty sandwich roll': 3, 'pinot grigio': 3, 'shanghai noodle': 3, 'croissant dough': 3, 'glazed pecan': 3, 'umeboshi': 3, 'crystal hot sauce': 3, 'besan flour': 3, 'bhindi': 3, 'canning salt': 3, 'ranch salad dressing mix': 3, 'ampalaya': 3, 'chili seasoning mix': 3, 'ginseng': 3, 'coke': 3, 'tokyo negi': 3, 'annatto powder': 3, 'marrow bone': 3, 'wondra flour': 3, 'pheasant': 3, 'frozen carrot': 3, 'chocolate wafer cooky': 3, 'quinoa flour': 3, 'habanero hot sauce': 3, 'pita pocket': 3, 'melba toast': 3, 'sole': 3, 'roasted unsalted cashew': 3, 'cantal': 3, 'burdock': 3, 'diced apple': 3, 'wish bone ranch dress': 3, 'rib eye roast': 3, 'mixed seafood': 3, 'unsalted margarine': 3, 'kewra essence': 3, 'rainbow trout': 3, 'asian chile paste': 3, 'strozzapreti': 3, 'asian noodle': 3, 'cajun style stewed tomato': 3, 'curing salt': 3, 'small pearl tapioca': 3, 'picholine': 3, 'mullet': 3, 'knorr chipotl minicub': 3, 'tex mex seasoning': 3, 'lasagna sheet': 3, 'radicchio leaf': 3, 'swordfish fillet': 3, 'pizza crust mix': 3, 'unsalted roasted pistachio': 3, 'annatto': 3, 'domino light brown sugar': 3, 'dried split pea': 3, 'sparkling sugar': 3, 'chocolate cake mix': 3, 'tamale filling': 3, 'curaao': 3, 'philadelphia cooking creme': 3, 'codfish': 3, 'bolillo': 3, 'top loin': 3, 'taleggio': 3, 'sweet chocolate': 3, 'char siu sauce': 3, 'rump steak': 3, 'maple extract': 3, 'remoulade': 3, 'chile negro': 3, 'mostaccioli': 3, 'extra fine granulated sugar': 3, 'organic cane sugar': 3, 'korean chile': 3, 'spaghetti sauce seasoning mix': 3, 'farofa': 3, 'cho cho': 3, 'guajillo chile powder': 3, 'veggie crumbles': 3, 'pumpkinseed kernel': 3, 'drummettes': 3, 'ciabatta roll': 3, 'seltzer': 3, 'chocolate baking bar': 3, 'recipe crumbles': 3, 'scotch whisky': 3, 'tenderloin steak': 3, 'yu choy': 3, 'hawaiian sweet roll': 3, 'kirschenliqueur': 3, 'sliced pear': 3, 'boudin': 3, '145 oz diced tomato': 3, 'low fat plain yoghurt': 3, 'chees mozzarella stick': 3, 'urad dal split': 3, 'gingersnap crumb': 3, 'green gram': 3, 'ajinomoto': 3, 'lentilles du puy': 3, 'deli roll': 3, 'linguica': 3, 'cuminseed': 3, 'unsalted pumpkinseed kernel': 3, 'jelli strawberri': 3, 'hero roll': 3, 'milkfish': 3, 'drambuie': 3, 'flavored vodka': 3, 'parmigiano': 3, 'oliv pit ripe': 3, 'frozen meatball': 3, 'sweet relish': 3, 'clamato juice': 3, 'sweet white miso': 3, 'baking chocolate': 3, 'eye round steak': 3, 'whole grain pasta': 3, 'tap water': 3, 'braising steak': 3, 'asian chili sauce': 3, 'millet flour': 3, 'hot sausage': 3, 'chunky mild salsa': 3, 'aka miso': 3, 'eye round roast': 3, 'white cannellini bean': 3, 'sundae syrup': 3, 'frozen pie crust': 3, 'pasta spiral': 3, 'ear': 3, 'corkscrew pasta': 3, 'kasha': 3, 'quick cooking tapioca': 3, 'cannoli shell': 3, 'white vermouth': 3, 'tempura batter': 3, 'asian chili red sauc': 3, 'natto': 3, 'poultry': 3, 'umeboshi paste': 3, 'top round roast': 3, 'farina': 3, 'duxelles': 3, 'smoked trout fillet': 3, 'anisette': 3, 'brownie': 3, 'sazon': 3, 'barbecue rub': 3, 'mie': 3, 'verjus': 3, 'albacore': 3, 'canton noodle': 3, 'blanched hazelnut': 3, 'boneless sirloin': 3, 'digestive biscuit': 3, 'roe': 3, 'chocolate covered english toffee': 3, 'swerve sweetener': 3, 'butterscotch chip': 3, 'deep fried tofu': 3, 'crumb topping': 3, 'yuca': 3, 'vine leaf': 3, 'mixed bell pepper': 3, 'oleo': 3, 'sorghum flour': 3, 'honeydew': 3, 'dried soba': 3, 'spice cake mix': 3, 'konnyaku': 3, 'capocollo': 3, 'kiwifruit': 3, 'fresh sea bass': 3, 'penn pasta cook drain': 3, 'candlenut': 3, 'low fat ricotta': 3, 'low fat marinara sauce': 3, 'helix snail': 3, '15 oz refried bean': 3, 'country loaf': 3, 'meal': 3, 'skate': 3, 'lemonade concentrate': 3, 'flounder': 3, 'canned snail': 3, 'jambalaya mix': 3, 'hibiscus flower': 3, 'brioche bun': 3, 'chinese pancake': 3, '10 oz frozen chopped spinach': 3, 'yucca': 3, 'swordfish': 3, 'poppadoms': 3, 'jujube': 3, 'coarse semolina': 3, 'frozen crabmeat thaw drain': 3, 'semisweet baking chocolate': 3, 'mizuna': 3, 'mole paste': 3, 'low fat flour tortilla': 3, 'instant tapioca': 3, 'chinese spinach': 3, 'ranch dip mix': 3, 'biscotti': 3, 'eggroll wrapper': 3, 'mcintosh apple': 3, 'empanada': 3, 'gold medal purpose flour': 3, 'jumbo shell': 3, 'yuzu juice': 3, 'arhar dal': 3, 'calabaza': 3, 'carne asada': 3, 'empanada dough': 3, 'sweet sour mix': 3, 'thai eggplant': 3, 'pt': 3, 'instant couscous': 3, 'bisquick original purpose baking mix': 3, 'cactus paddle': 3, 'san marzano tomato': 3, 'unagi': 3, 'potsticker wrapper': 3, 'chestnut pure': 3, 'frozen spring roll wrapper': 3, 'ro tel diced tomato green chilies': 3, 'japanese breadcrumb': 3, 'black bass': 3, 'flageolet': 3, 'small green chile': 3, 'large marshmallow': 3, 'kangkong': 3, 'egglands best egg': 3, 'panang curry paste': 3, 'good season italian dressing mix': 3, 'thousand island dressing': 3, 'slider bun': 3, 'acinus di pepe': 3, 'cookie crumb': 3, 'framboise eau de vie': 3, 'pistou': 3, 'pot sticker': 3, 'gray salt': 3, 'topping': 3, 'kinchay': 3, 'split yellow lentil': 3, 'ground asafetida': 3, 'maitake mushroom': 3, 'citrus peel': 4, 'sea algae': 4, 'hop': 4, 'blackberry brandy': 4, 'pickapeppa sauce': 4, 'gingersnap': 4, 'ground flaxseed': 4, 'fresh veget': 4, 'eau de vie': 4, 'lean steak': 4, 'smoked trout': 4, 'italian seasoning mix': 4, 'vidalia': 4, 'reduced sodium tamari': 4, 'fry mix': 4, 'prepared pizza crust': 4, 'mozzarella ball': 4, 'squab': 4, 'tenderloin roast': 4, 'rib roast': 4, 'quatre pices': 4, 'rye': 4, 'cola soft drink': 4, 'fresh lima bean': 4, 'biscuit baking mix': 4, 'pure acai puree': 4, 'gooseberry': 4, 'glace cherry': 4, 'pizza shell': 4, 'gelato': 4, 'italian loaf': 4, 'purpose seasoning': 4, 'pig foot': 4, 'hominy grit': 4, 'salad seasoning mix': 4, 'fettuccine cook drain': 4, 'frozen tater tot': 4, 'cavolo nero': 4, 'kahlua': 4, 'methi leaf': 4, 'pudding': 4, 'barilla': 4, 'hatcho miso': 4, 'lily flower': 4, 'whey': 4, 'sliced kalamata olive': 4, 'kamaboko': 4, 'sambuca': 4, 'mini phyllo dough shell': 4, 'reduced fat alfredo sauce': 4, 'frozen pepper onion': 4, 'sweet italian sausag link cut': 4, 'sliced salami': 4, 'knockwurst': 4, 'frozen lima bean': 4, 'chopped hazelnut': 4, 'oil packed anchovy fillet': 4, 'tamale': 4, 'sansho': 4, 'candy bar': 4, 'low fat refried bean': 4, 'tri tip': 4, 'manicotti pasta': 4, 'snail shell': 4, 'spring roll skin': 4, 'hollandaise sauce': 4, 'grated cotija': 4, 'california chile': 4, 'bing cherry': 4, 'stevia extract': 4, 'evaporated cane juice': 4, 'mahi mahi': 4, 'sliced apple': 4, 'treacle': 4, 'dry lasagna': 4, 'ground italian sausage': 4, 'goose fat': 4, 'shortcrust pastry': 4, 'london broil': 4, 'ground blanched almond': 4, 'jarlsberg': 4, 'muscat': 4, 'grissini': 4, 'candy sprinkle': 4, 'black turtle bean': 4, 'bloody mary mix': 4, 'rendered duck fat': 4, 'achiote powder': 4, 'cress': 4, 'brown ale': 4, 'uncle ben': 4, 'hidden valley original ranch dressing': 4, 'flour tortilla low fat': 4, 'stewing hen': 4, 'johnsonville mild italian sausage link': 4, 'pomelo': 4, 'cold cut': 4, 'rosewater': 4, 'pita wedge': 4, 'green plantain': 4, 'marmalade': 4, 'mezcal': 4, 'quick oat': 4, 'unseasoned breadcrumb': 4, 'papad': 4, 'dark muscovado sugar': 4, 'sambal olek': 4, 'sugar cube': 4, 'pie pastry': 4, '7': 4, 'unsweetened applesauce': 4, 'pozole': 4, 'ground pecan': 4, 'escargot': 4, 'merluza': 4, 'raw pistachio': 4, 'kasseri': 4, 'meringue nest': 4, 'camembert': 4, 'filo dough': 4, 'asafetida powder': 4, 'iceberg': 4, 'crushed cornflakes': 4, 'laurel leaf': 4, 'chinese barbecue sauce': 4, 'water spinach': 4, 'juice concentrate': 4, 'candied peel': 4, 'jello': 4, 'reduced fat mozzarella': 4, 'mein': 4, 'beni shoga': 4, 'cajeta': 4, 'gingersnap cooky': 4, 'abura age': 4, '': 4, 'marrow': 4, 'sichuanese chili paste': 4, 'carne seca': 4, 'pitted medjool date': 4, 'cherrystone clam': 4, 'seasoned black bean': 4, 'color food orang': 4, 'foot': 4, 'gluten free flour': 4, 'gorgonzola dolce': 4, 'nonfat mayonnaise': 4, 'manzanilla': 4, 'coarse sugar': 4, 'white frosting': 4, 'citric acid': 4, 'crayfish': 4, 'red jalapeno pepper': 4, 'taco bell taco seasoning mix': 4, 'burgundy': 4, 'jamaican allspice': 4, 'spring roll': 4, 'monkfish': 4, 'cholula hot sauce': 4, 'pizza topping': 4, 'clementine': 4, 'chocolate glaze': 4, 'anchovy filet': 4, 'caramel topping': 4, 'french fri frozen': 4, 'hot salsa': 4, 'cracker meal': 4, 'flowering chive': 4, 'muffin': 4, 'gold medal flour': 4, 'dried bean': 4, 'caribbean jerk seasoning': 4, 'low fat pasta sauce': 4, 'cake batter': 4, 'syd hot rub': 4, 'salad dressing mix': 4, 'buffalo mozzarella': 4, 'bengali 5 spice': 4, 'chilled prosecco': 4, 'parmigiana reggiano': 4, 'iodized salt': 4, 'old el paso refried bean': 4, 'alfalfa sprout': 4, 'mr dash': 4, 'sliced leek': 4, 'muffin mix': 4, 'ganache': 4, 'regular tofu': 4, 'flax seed': 4, 'white poppy seed': 4, 'queso panela': 4, 'prepared pie crust': 4, 'sourdough starter': 4, 'pork liver': 5, 'elderberry': 5, 'carnation': 5, 'burger bun': 5, 'demi glace': 5, 'starchy potato': 5, 'sirloin tip roast': 5, 'dried chile pepper': 5, 'angel food cake': 5, 'old el paso flour tortilla': 5, 'margarita mix': 5, 'spam': 5, 'caster': 5, 'sourdough loaf': 5, 'petite pea': 5, 'burger': 5, 'shortbread cooky': 5, 'fregola': 5, 'self rising cake flour': 5, 'gluten free purpose flour': 5, 'ahi': 5, 'frozen mixed thawed vegetable': 5, 'boston butt': 5, 'smoked kielbasa': 5, 'idli': 5, 'tapioca pearl': 5, 'buttercream frosting': 5, 'soaking liquid': 5, 'espresso powder': 5, 'tandoori paste': 5, 'light red kidney bean': 5, 'dulce de leche': 5, 'basmati': 5, 'pancake mix': 5, 'ground chile': 5, 'splenda brown sugar blend': 5, 'custard powder': 5, 'greek style vinaigrette': 5, 'hog casing': 5, 'rioja': 5, 'red vermouth': 5, 'jerk marinade': 5, 'seitan': 5, 'sofrito': 5, 'cooking liquid': 5, 'pastry flour': 5, 'baking spray': 5, 'jamaican jerk spice': 5, 'prego traditional italian sauce': 5, 'adzuki bean': 5, 'black fungus': 5, 'spelt flour': 5, 'fine granulated sugar': 5, 'small caper rins drain': 5, 'bouquet': 5, 'gremolata': 5, 'grenadine': 5, 'emerils original essence': 5, 'tapioca': 5, 'sorghum syrup': 5, 'compote': 5, 'kraft zesty italian dressing': 5, 'cocktail sauce': 5, 'bragg liquid amino': 5, 'collard green leaf': 5, 'crme de cassis': 5, 'pink bean': 5, 'cube steak': 5, 'globe eggplant': 5, 'blackening seasoning': 5, 'borlotti bean': 5, 'millet': 5, 'fresh mozzarella ball': 5, 'pepperidge farm puff pastry': 5, 'red gold diced tomato': 5, 'pita loaf': 5, 'flavored syrup': 5, 'ragu cheesi classic alfredo sauc': 5, 'espresso bean': 5, 'taco bell home original': 5, 'persimmon': 5, 'tandoori seasoning': 5, 'boar': 5, 'uncooked vermicelli': 5, 'sliced green olive': 5, 'rome apple': 5, 'grill seasoning': 5, 'promise buttery spread': 5, 'sazon seasoning': 5, 'assorted fresh vegetable': 5, 'waffle': 5, 'fresh angel hair': 5, 'flaxseed': 5, 'sugar cane': 5, 'flaked': 5, 'raw cane sugar': 5, 'edam': 5, 'meatloaf': 5, 'cornflakes': 5, 'jerusalem artichoke': 5, 'dried thai chili': 5, 'heinz chili sauce': 5, 'lea perrins worcestershire sauce': 5, 'round': 5, 'pot roast': 5, 'pappadams': 5, 'herdez salsa casera': 5, 'bulb': 5, 'wholemeal flour': 5, 'mo hanh': 5, 'bone broth': 5, 'soft taco size flour tortilla': 5, 'bechamel': 5, 'hard salami': 5, 'tortilla wrap': 5, 'low moisture mozzarella': 5, 'round loaf': 5, 'aai powder': 5, 'chop green chilies undrain': 5, 'sauvignon blanc': 5, 'dijon': 5, 'chinese sesame paste': 5, 'porridge oat': 5, 'kraft miracle whip dressing': 5, 'red swiss chard': 5, 'miniature semisweet chocolate chip': 5, 'pasilla': 5, 'sushi nori': 5, 'schmaltz': 5, 'nopalitos': 5, 'frozen pizza dough': 5, 'kefir': 5, 'nuoc nam': 5, 'dark chocolate chip': 5, 'red apple': 5, 'gouda': 5, 'frozen hash brown': 5, 'vegan worcestershire sauce': 5, 'chinese rock sugar': 5, '40 le sodium taco seasoning mix': 5, 'brown gravy mix': 5, 'broad bean': 5, 'chili seasoning': 5, 'peeled prawn': 5, 'yuzu': 5, 'sooji': 5, 'chiffonade': 5, 'tom yum paste': 5, 'twist': 5, 'sago': 5, 'shredded nori': 5, 'smoked fish': 6, 'balm': 6, 'instant espresso granule': 6, 'crusty roll': 6, 'kalonji': 6, 'wax bean': 6, 'vegan margarine': 6, 'duck breast half': 6, 'capicola': 6, 'gluten free tamari': 6, 'lasagne': 6, 'uncooked rigatoni': 6, 'toasted cashew': 6, 'polenta prepar': 6, 'roasted chestnut': 6, 'tart': 6, 'tenderloin': 6, 'seasoned flour': 6, 'fromage blanc': 6, 'chocolate candy bar': 6, 'fresh chile': 6, 'porterhouse steak': 6, 'white peach': 6, 'cooked vermicelli': 6, 'unsweetened soymilk': 6, 'cornbread stuffing mix': 6, 'mahimahi': 6, 'clam well scrub': 6, 'mild curry paste': 6, 'vegan mayonnaise': 6, 'limoncello': 6, 'golden beet': 6, 'black': 6, 'sponge': 6, 'splenda calorie sweetener': 6, 'panettone': 6, 'bow': 6, 'rouille': 6, 'bottle gourd': 6, 'venison': 6, 'fideos': 6, 'wafer': 6, 'hellmanns real mayonnaise': 6, 'cornflake crumb': 6, 'roasted white sesame seed': 6, 'prepared pasta sauce': 6, 'fresh chili': 6, 'haas avocado': 6, 'ritz cracker': 6, 'baby eggplant': 6, 'posole': 6, 'satsuma imo': 6, 'peach heavy syrup': 6, 'squirt': 6, 'peperoncino': 6, 'doenzang': 6, 'spelt': 6, 'kimchi juice': 6, 'lychee': 6, 'pasta shell small': 6, 'frying oil': 6, 'vermouth': 6, 'dri leav rosemari': 6, 'kewpie mayonnaise': 6, 'johnsonville andouille': 6, 'piment despelette': 6, 'sandwich bun': 6, 'nuoc mam': 6, 'jack daniel': 6, 'hemp seed': 6, 'satsuma': 6, 'safflower': 6, 'pickled beet': 6, 'uncooked ziti': 6, 'yellow chive': 6, 'accent seasoning': 6, 'shimeji mushroom': 6, 'dry rub': 6, 'diced potato': 6, 'sandwich': 6, 'lemonade': 6, 'chocolate curl': 6, 'gyoza skin': 6, 'agar': 6, 'mature cheddar': 6, 'crostini': 6, 'dried chive': 6, 'massaman curry paste': 6, 'jerk sauce': 6, 'sauterne': 6, 'toasted pumpkinseed': 6, 'low sodium teriyaki sauce': 6, 'mixed peel': 6, 'self raising flour': 6, 'cake mix': 6, 'campanelle': 6, 'herdez salsa verde': 6, 'prepared guacamole': 6, 'sambal chile paste': 6, 'crumbled cornbread': 6, 'dried scallop': 6, 'split pea': 6, 'kewra water': 6, 'dried udon': 6, 'fine herbes': 6, 'elbow pasta': 6, 'pie filling': 6, 'liquor': 6, 'manicotti': 6, 'casing': 6, 'challa': 6, 'low sodium black bean': 6, 'pearl couscous': 6, 'caper berry': 6, 'mussel well scrubbed': 6, 'frozen pound cake': 6, 'crushed graham cracker': 6, 'calamata olive': 6, 'fudge brownie mix': 6, 'frozen whip topping thaw': 6, 'tri tip roast': 6, 'filet mignon steak': 6, 'queso anejo': 6, 'mild salsa': 6, 'dried date': 6, 'smoked sea salt': 6, 'broiler fryer': 6, 'southern comfort': 6, 'neufchtel': 6, 'harissa sauce': 6, 'medium salsa': 6, 'balsamic reduction': 6, 'shredded colby': 6, 'hot green chile': 6, 'sweet gherkin': 6, 'mitsuba': 6, 'mission fig': 6, 'violet': 7, 'bergamot': 7, 'carob': 7, 'marshmallow': 7, 'goji berry': 7, 'drumstick': 7, 'steel cut oat': 7, 'luke warm water': 7, 'pickled jalapeno pepper': 7, 'organic sugar': 7, 'sicilian olive': 7, 'dried navy bean': 7, 'mini chocolate chip': 7, 'sirloin tip': 7, 'amaretti': 7, 'hatch green chile': 7, 'snail': 7, 'icing': 7, 'anjou pear': 7, 'chambord': 7, 'short pasta': 7, 'taco topping': 7, 'tripe': 7, 'lardons': 7, 'gaeta olive': 7, 'seltzer water': 7, 'baton': 7, 'flat anchovy': 7, 'pappardelle pasta': 7, 'frozen limeade': 7, 'polish sausage': 7, 'frozen vegetable': 7, 'oreo cooky': 7, 'perciatelli': 7, 'green split pea': 7, 'maple sugar': 7, 'balsamico bianco': 7, 'pierogi': 7, 'branzino': 7, 'soman': 7, 'kochujang': 7, 'brat': 7, 'yukon gold': 7, 'coco': 7, 'portobello cap': 7, 'cooking fat': 7, 'chopped leaf': 7, 'mixed nut': 7, 'merguez sausage': 7, 'deep dish pie crust': 7, 'halibut steak': 7, 'marzipan': 7, 'vin santo': 7, 'low fat spaghetti sauce': 7, 'pomegranate molasses': 7, 'medium curry powder': 7, 'dark leafy green': 7, 'taco seasoning reduced sodium': 7, 'dried pappardelle': 7, 'bass fillet': 7, 'hot chili paste': 7, 'grated pecorino': 7, 'soft shelled crab': 7, 'double crust pie': 7, 'chenpi': 7, 'pancake': 7, 'cola': 7, 'reduced sodium tamari sauce': 7, 'flanken short rib': 7, 'free range chicken': 7, 'roasted pistachio': 7, 'loaf': 7, 'old el paso thick n chunky salsa': 7, 'catsup': 7, 'silver': 7, 'banger': 7, '40 le sodium taco seasoning': 7, 'fresh pasta': 7, 'grenadine syrup': 7, 'quail egg': 7, 'burrata': 7, 'leg quarter': 7, 'frozen sweet pea': 7, 'cubed potato': 7, 'monkfish fillet': 7, 'pickle juice': 7, 'medium tomato': 7, 'black treacle': 7, 'diced pimento': 7, 'goat': 7, 'sugar substitute': 7, 'reduced sodium black bean': 7, 'pressed tofu': 7, 'chunky pasta sauce': 7, 'dende oil': 7, 'crisco': 7, 'sorbet': 7, 'cooked meatball': 7, 'tubetti': 7, 'chipotle paste': 7, 'seasoning mix': 7, 'black raspberry': 8, 'roasted almond': 8, 'grape brandy': 8, 'chocolate bar': 8, 'mixed mushroom': 8, 'grana padano': 8, 'andouille sausage link': 8, 'italian salad dressing mix': 8, 'confit': 8, 'liquid amino': 8, 'garnish': 8, 'hash brown': 8, 'english muffin': 8, 'maldon sea salt': 8, 'lotus root': 8, 'frozen raspberry': 8, 'pimenton': 8, 'amaretto liqueur': 8, 'salted dry roasted peanut': 8, 'biscuit mix': 8, 'sugar syrup': 8, 'creme anglaise': 8, 'dripping': 8, 'brine cured green olive': 8, 'sub bun': 8, 'custard': 8, 'red delicious apple': 8, 'stuffing mix': 8, 'wonton skin': 8, 'pace chunky salsa': 8, 'crisp': 8, 'small pasta': 8, 'italian herb': 8, 'frozen green bean': 8, 'emmenthal': 8, 'bertolli alfredo sauce': 8, 'pepperoni turkei': 8, 'nam pla': 8, 'striped bass': 8, 'unbleached flour': 8, 'gumbo file': 8, 'cointreau liqueur': 8, 'achiote': 8, 'low sodium taco seasoning': 8, 'char siu': 8, 'ragu': 8, 'diced tomato green chilies': 8, 'chia seed': 8, 'catalina dressing': 8, 'chapati flour': 8, 'spaghetti cook drain': 8, 'shiso leaf': 8, 'ramen': 8, 'spring water': 8, 'grit quick': 8, 'merlot': 8, 'mesclun': 8, 'chunky': 8, 'black gram': 8, 'stew': 8, 'gherkin': 8, 'cajun spice mix': 8, 'bisquick baking mix': 8, 'french fry': 8, 'pie': 8, 'peperoncini': 8, 'french dressing': 8, 'green apple': 8, 'pinot noir': 8, 'yakisoba noodle': 8, 'dandelion green': 8, 'dried cornhusk': 8, 'lily bud': 8, 'pectin': 8, 'furikake': 8, 'pomegranate': 8, 'hard shelled clam': 8, 'tart shell': 8, 'salted cashew': 8, 'peppermint oil': 9, 'litchi': 9, 'gardenia': 9, 'baked potato': 9, 'lingonberry': 9, 'dried black mushroom': 9, 'creole style seasoning': 9, 'pasta sheet': 9, 'kefalotyri': 9, 'red radish': 9, 'chocolate sauce': 9, 'vinaigrette dressing': 9, 'grappa': 9, 'field pea': 9, 'snapper': 9, 'canned chopped tomato': 9, 'hot curry powder': 9, 'jerk seasoning': 9, 'firm silken tofu': 9, 'fresca': 9, 'flat iron steak': 9, 'confit duck leg': 9, 'daal': 9, 'stilton': 9, 'edible flower': 9, 'light alfredo sauce': 9, 'fritos': 9, 'black mission fig': 9, 'cabernet sauvignon': 9, 'khoa': 9, 'dried mixed herb': 9, 'smoked sweet spanish paprika': 9, 'shirataki': 9, 'meringue': 9, 'pita round': 9, 'queso asadero': 9, 'rajma': 9, 'baked bean': 9, 'croissant': 9, 'sanding sugar': 9, 'ackee': 9, 'maltose': 9, 'russet': 9, 'trout': 9, 'french lentil': 9, 'bittersweet chocolate chip': 9, 'callaloo': 9, 'raita': 9, 'chipotle sauce': 9, 'frozen peach': 9, 'chvre': 9, 'loin': 9, 'reduced fat firm tofu': 9, 'brisket': 9, 'matzo meal': 9, 'cooked rigatoni': 9, 'red chile sauce': 9, 'cooking apple': 9, 'candied cherry': 9, 'patis': 9, 'mochiko': 9, 'batter': 9, 'free range egg': 9, 'cockle': 9, 'kidney': 9, 'refried black bean': 9, 'decorating sugar': 9, 'natural pistachio': 9, 'nuoc cham': 9, 'toasted baguette': 9, 'campari': 9, 'steak seasoning': 9, 'channa dal': 9, 'old el paso enchilada sauce': 9, 'puff pastry sheet': 9, 'snapper fillet': 9, 'shaoxing': 9, 'cane syrup': 9, 'celtic salt': 9, 'shank': 9, 'king prawn': 9, 'refrigerated fettuccine': 9, 'pita chip': 9, 'english toffee bit': 9, 'ranch style bean': 9, 'mandarin peel': 10, 'kohlrabi': 10, 'beef liver': 10, 'sourdough': 10, 'chocolate instant pudding': 10, 'zinfandel': 10, 'water chestnut drained chopped': 10, 'light pancake syrup': 10, 'dinner roll': 10, 'pillsbury refrigerated crescent dinner roll': 10, 'tomatillo salsa': 10, 'aioli': 10, 'oil cured olive': 10, 'italian eggplant': 10, 'steamer': 10, 'french roll': 10, 'balsamic vinaigrette': 10, 'wheel': 10, 'sponge cake': 10, 'toasted peanut': 10, 'hot dog bun': 10, 'sole fillet': 10, 'vine tomato': 10, 'hanger steak': 10, 'small red bean': 10, 'lumpia skin': 10, 'chard': 10, 'wish bone italian dressing': 10, 'atta': 10, 'focaccia': 10, 'mirlitons': 10, 'red': 10, 'scotch': 10, 'chinese eggplant': 10, 'bonito': 10, 'piecrust': 10, 'shell pasta': 10, 'ground sausage': 10, 'yellow hominy': 10, 'crushed pineapple juice': 10, 'thai noodle': 10, 'sweet pickle relish': 10, 'citron': 10, 'nutella': 10, 'nilla wafer': 10, 'spicy sausage': 10, 'fresh green pea': 10, 'zest': 10, 'fishcake': 10, 'tortilla shell': 10, 'fresh udon': 10, 'arbol chile': 10, 'mortadella': 10, 'chardonnay': 10, 'chianti': 10, 'adobo seasoning': 10, 'groundnut': 10, 'carnitas': 10, 'cavatelli': 10, 'queso blanco': 10, 'mahi mahi fillet': 10, 'caramel': 10, 'roux': 10, 'canola mayonnaise': 10, 'flavored oil': 10, 'chip plain tortilla': 10, 'korean chile paste': 10, 'crescent roll': 10, 'pak choi': 10, 'ground walnut': 10, 'black currant': 11, 'pear brandy': 11, 'huckleberry': 11, 'spearmint': 11, 'giardiniera': 11, 'pappardelle': 11, 'ramp': 11, 'demerara sugar': 11, 'flora cuisine': 11, 'sourdough baguette': 11, 'quail': 11, 'himalayan salt': 11, 'red beet': 11, 'pasta water': 11, 'ravva': 11, 'marmite': 11, 'achiote paste': 11, 'pigeon pea': 11, 'mulato chile': 11, 'soda water': 11, 'yellow curry paste': 11, 'dhal': 11, 'frozen mixed berry': 11, 'granola': 11, 'chestnut mushroom': 11, 'frozen limeade concentrate': 11, 'vegetarian refried bean': 11, 'buffalo sauce': 11, 'linguini': 11, 'chuck steak': 11, 'frangelico': 11, 'fatback': 11, 'flounder fillet': 11, 'fat free frozen top whip': 11, 'sandwich roll': 11, 'bouillon cube': 11, 'biryani masala': 11, 'sliced olive': 11, 'black truffle': 11, 'cavatappi': 11, 'ditalini': 11, 'white chocolate chip': 11, 'sweet pickle': 11, 'graham cracker crust': 11, 'crumbles': 11, 'thai chili paste': 11, 'masoor dal': 11, 'ruby port': 11, 'low fat mozzarella': 11, 'brioche': 11, 'amaretti cooky': 11, 'kaiser roll': 11, 'ancho': 11, 'shiro miso': 11, 'filet mignon': 11, 'mincemeat': 11, 'sweet vermouth': 11, 'bisquick': 11, 'concord grape': 12, 'camembert cheese': 12, 'foie gras': 12, 'boneless rib eye steak': 12, 'black salt': 12, 'perilla': 12, 'dry pasta': 12, 'prosecco': 12, 'risotto': 12, 'masa dough': 12, 'capellini': 12, 'gold potato': 12, 'old el paso chopped green chile': 12, 'doritos': 12, 'pickling salt': 12, 'choy sum': 12, 'refrigerated biscuit': 12, 'cuban pepper': 12, 'frozen lemonade concentrate': 12, 'spike seasoning': 12, 'bengal gram': 12, 'seafood': 12, 'annatto seed': 12, 'pickling cucumber': 12, 'cointreau': 12, 'giblet': 12, 'hellmann best food light mayonnais': 12, 'dungeness crab': 12, 'pink peppercorn': 12, 'herb seasoning': 12, 'mild green chile': 12, 'fajita size flour tortilla': 12, 'taro': 12, 'preserve': 12, 'small new potato': 12, 'prepared lasagne': 12, 'coca cola': 12, 'non stick spray': 12, 'riesling': 12, 'jalape': 12, 'biscuit dough': 12, 'japanese turnip': 12, 'sweet pea': 12, 'cool whip': 12, 'soy': 12, 'manioc flour': 12, 'blue crab': 12, 'chinese black mushroom': 12, 'baked pizza crust': 12, 'salmon roe': 13, 'japanese plum': 13, 'artemisia': 13, 'herring': 13, 'trout fillet': 13, 'sweet sour sauce': 13, 'instant espresso': 13, 'guajillo': 13, 'fat free refried bean': 13, 'chipotle salsa': 13, 'dark molasses': 13, 'relish': 13, 'equal sweetener': 13, 'bitter': 13, 'yellow lentil': 13, 'single crust pie': 13, 'gala apple': 13, 'togarashi': 13, 'caesar salad dressing': 13, 'gran marnier': 13, 'sweet potato yam': 13, 'pan dripping': 13, 'sprite': 13, 'golden caster sugar': 13, 'old el paso taco seasoning mix': 13, 'shredded coleslaw mix': 13, 'medium firm tofu': 13, 'chilegarlic sauce': 13, 'low sodium worcestershire sauce': 13, 'cornish hen': 13, 'ale': 13, 'thin spaghetti': 13, 'parmagiano reggiano': 13, 'cornish game hen': 13, 'sweet mini bell': 13, 'angostura bitter': 13, 'poha': 13, 'sorrel': 13, 'frozen shelled edamame': 13, 'fresh cranberry': 13, 'italian style seasoning': 13, 'unsalted pistachio': 13, 'boneless sirloin steak': 13, 'tentacle': 13, 'gyoza': 13, 'fresno chile': 13, 'hot smoked paprika': 13, 'mole sauce': 13, 'tapenade': 13, 'arrowroot powder': 14, 'sparerib': 14, 'frozen whipped topping': 14, 'cracker crumb': 14, 'chopped nut': 14, 'stevia': 14, 'varnish clam': 14, 'mild curry powder': 14, 'frozen strawberry': 14, 'morel': 14, 'old fashioned oat': 14, 'pace picante sauce': 14, 'yellow rock sugar': 14, 'shelled pistachio': 14, 'curry sauce': 14, 'dried pasta': 14, 'yolk': 14, 'toasted nori': 14, 'lager': 14, 'thin pizza crust': 14, 'rapeseed oil': 14, 'rump roast': 14, 'rock salt': 14, 'dried fettuccine': 14, 'cornbread mix': 14, 'hot chili oil': 14, 'stir fry sauce': 14, 'split black lentil': 14, 'aai': 14, 'toasted slivered almond': 14, 'white kidney bean': 14, 'steak sauce': 14, 'collard': 14, 'fried egg': 14, 'dal': 14, 'min': 14, 'picholine olive': 14, 'carbonated water': 14, 'arrowroot': 14, 'gemelli': 14, 'tonkatsu sauce': 14, 'sunflower seed': 14, 'roasted meat': 15, 'marshmallow creme': 15, 'whole nutmeg': 15, 'pound cake': 15, 'calimyrna fig': 15, 'pickled vegetable': 15, 'dried kidney bean': 15, 'plain breadcrumb': 15, 'duck fat': 15, 'string bean': 15, 'boiling onion': 15, 'mexican seasoning mix': 15, 'sweetener': 15, 'stone ground cornmeal': 15, 'baby portobello mushroom': 15, 'chanterelle': 15, 'red capsicum': 15, 'sprout': 15, 'pomegranate juice': 15, 'ajwain': 15, 'pig': 15, 'idaho potato': 15, 'chocolate syrup': 15, 'prebaked pizza crust': 15, 'breadstick': 15, 'tostada': 15, 'poblano': 15, 'splenda': 15, 'chat masala': 15, 'heart romaine': 15, 'extract': 15, 'calamansi': 15, 'adobo': 15, 'hoagie roll': 16, 'yellow cake mix': 16, 'espresso': 16, 'fire roasted diced tomato': 16, 'grouper': 16, 'boiled egg': 16, 'seafood stock': 16, 'ravioli': 16, 'canela': 16, 'bucatini': 16, 'sardine': 16, 'jackfruit': 16, 'graham cracker': 16, 'small white bean': 16, 'brewed espresso': 16, 'asian eggplant': 16, 'habanero': 16, 'cardamon': 16, 'tart apple': 16, 'duck drumstick': 16, 'bouillon': 16, 'hand': 16, 'toor dal': 16, 'dashi powder': 16, 'calamari': 16, 'lumpia wrapper': 16, 'coconut oil': 17, 'cabernet sauvignon wine': 17, 'zesty italian dressing': 17, 'kecap manis': 17, 'maida flour': 17, 'stuffing': 17, 'pickled carrot': 17, 'dashi kombu': 17, 'dried tart cherry': 17, 'soppressata': 17, 'seafood seasoning': 17, 'methi': 17, 'sea salt flake': 17, 'garden pea': 17, 'bun': 17, 'tzatziki': 17, 'ditalini pasta': 17, 'bicarbonate soda': 17, 'italian style stewed tomato': 17, 'rub': 17, 'calamansi juice': 17, 'french fried onion': 17, 'unbaked pie crust': 17, 'kirsch': 17, 'sultana': 17, 'bocconcini': 17, 'color food green': 17, 'brine': 17, 'chocolate chip': 17, 'white cake mix': 17, 'tempeh': 17, 'brine cured olive': 17, 'orange flower': 18, 'sassafras': 18, 'penne rigate': 18, 'phyllo': 18, 'red kidnei bean rins drain': 18, 'frozen edamame bean': 18, 'green peppercorn': 18, 'rock sugar': 18, 'sesame paste': 18, 'frozen blueberry': 18, 'baking mix': 18, 'asadero': 18, 'whole almond': 18, 'ragu old world style pasta sauc': 18, 'fresh chevre': 18, 'chopped fresh herb': 18, 'dried mushroom': 18, 'top sirloin': 18, 'toast': 18, 'fryer chicken': 18, 'long bean': 18, 'shichimi togarashi': 18, 'salt added black bean': 18, 'crepe': 18, 'suet': 18, 'mild italian sausage': 18, 'essence': 18, 'gyoza wrapper': 18, 'salt added diced tomato': 18, 'baby back rib': 18, 'cutlet': 18, 'chocolate sprinkle': 18, 'hamburger': 18, 'chocolate shaving': 18, 'condiment': 19, 'guava': 19, 'ouzo': 19, 'hot chili': 19, 'frosting': 19, 'baby potato': 19, 'wakame': 19, 'red chile powder': 19, 'caramel sauce': 19, 'vermicelli noodle': 19, 'shiso': 19, 'unsalted roasted peanut': 19, 'tandoori spice': 19, 'frozen mixed vegetable': 19, 'frisee': 19, 'sea bass': 19, 'large flour tortilla': 19, 'bouquet garni': 19, 'nori sheet': 19, 'baby green': 19, 'new york strip steak': 19, 'quick cooking oat': 19, 'passion fruit': 20, 'prickly pear': 20, 'low fat mayonnaise': 20, 'fingerling potato': 20, 'frozen pea carrot': 20, 'manicotti shell': 20, 'cane sugar': 20, 'louisiana hot sauce': 20, 'brine cured black olive': 20, 'crumb': 20, 'pitted prune': 20, 'cornbread': 20, 'xanthan gum': 20, 'tortellini': 20, 'port': 20, 'five spice powder': 20, 'mexicorn': 20, 'light molasses': 20, 'five spice': 20, 'tartar sauce': 20, 'dried salted codfish': 20, 'shahi jeera': 20, 'browning': 20, 'prepar pesto': 20, 'habanero chile': 20, 'yellow miso': 20, 'sumac': 21, 'kahla': 21, 'pepitas': 21, 'chocolate morsel': 21, 'sweet cherry': 21, 'double acting baking powder': 21, 'pickling spice': 21, 'maggi': 21, 'slaw': 21, 'soda': 21, 'applesauce': 21, 'whitefish fillet': 21, 'shoyu': 21, 'calvados': 21, 'country crock spread': 21, 'duck breast': 21, 'pernod': 21, 'hot chili powder': 21, 'farro': 21, 'muscovado sugar': 21, 'italian tomato': 21, 'bawang goreng': 21, 'jelly': 21, 'harissa paste': 21, 'tawny port': 21, 'granulated white sugar': 21, 'meatball': 21, 'bulk italian sausag': 21, 'nopales': 21, 'frozen chopped spinach thawed squeezed dry': 21, 'fajita seasoning mix': 21, 'tagliatelle': 21, 'dried guajillo chile': 21, 'guanciale': 21, 'oil cured black olive': 21, 'whole peppercorn': 21, 'licorice': 22, 'broccolini': 22, 'piloncillo': 22, 'navy bean': 22, 'dried chickpea': 22, 'coleslaw': 22, 'jamaican jerk season': 22, 'crema mexicana': 22, 'korean chile flake': 22, 'chinese noodle': 22, 'glaze': 22, 'yardlong bean': 22, 'ground paprika': 22, 'sliced shallot': 22, 'yellow food coloring': 22, 'ponzu': 22, 'swordfish steak': 22, 'hummus': 22, 'roast': 22, 'mixed vegetable': 22, 'red snapper': 22, 'reduced fat mayonnaise': 22, 'pepperoncini': 22, 'roquefort cheese': 23, 'roasted hazelnut': 23, 'moong dal': 23, 'ciabatta': 23, 'bosc pear': 23, 'pastry shell': 23, 'gluten': 23, 'hot dog': 23, 'chana dal': 23, 'boneless chuck roast': 23, 'tasso': 23, 'sliced tomato': 23, 'eel': 24, 'passata': 24, 'sirloin': 24, 'tostada shell': 24, 'medium egg': 24, 'fine salt': 24, 'gravy': 24, 'hungarian paprika': 24, 'bulgur': 24, 'cantaloupe': 24, 'nigella seed': 24, 'beefsteak tomato': 24, 'spaghettini': 24, 'rabbit': 24, 'seedless red grape': 24, 'chilli paste': 24, 'armagnac': 25, 'toasted pecan': 25, 'refrigerated crescent roll': 25, 'chipotle': 25, 'fat free mayonnaise': 25, 'masa': 25, 'jack': 25, 'chili bean': 25, 'toasted walnut': 25, 'ground tumeric': 25, 'fleur de sel': 25, 'part skim mozzarella': 25, 'chayote': 26, 'ricotta salata': 26, 'smoked gouda': 26, 'candy': 26, 'sesame': 26, 'pie dough': 26, 'rotel tomato': 26, 'fat free half half': 26, 'whole allspice': 26, 'kirby cucumber': 26, 'lasagna noodle cooked drained': 26, 'stout': 26, 'halibut': 26, 'yellow split pea': 26, 'flavoring': 26, 'munster cheese': 27, 'mutton': 27, 'top round steak': 27, 'unsalted cashew': 27, 'pickled jalapeno': 27, 'fava bean': 27, 'jeera': 27, 'jam': 27, 'pesto sauce': 27, 'nioise olive': 27, 'veggie': 27, 'white peppercorn': 27, 'bbq sauce': 27, 'diced tomato juice': 27, 'pastry dough': 27, 'chinese sausage': 27, 'top sirloin steak': 27, 'flatbread': 27, 'cooky': 27, 'shucked oyster': 27, 'white button mushroom': 27, 'black mustard seed oil': 28, 'lo mein noodle': 28, 'kielbasa': 28, 'crust': 28, 'round steak': 28, 'cooked quinoa': 28, 'short rib': 28, 'amaretto': 28, 'champagne': 28, 'red miso': 29, 'fontina': 29, 'genoa salami': 29, 'ziti': 29, 'brown lentil': 29, 'tilapia': 29, 'msg': 29, 'pasilla chile': 29, 'pomegranate seed': 29, 'crema mexican': 29, 'raw sugar': 29, 'breakfast sausage': 30, 'italian seasoned breadcrumb': 30, 'fettuccine pasta': 30, 'pitted olive': 30, 'grand marnier': 30, 'golden syrup': 30, 'prepar salsa': 30, 'dumpling': 30, 'white flour': 30, 'dumpling wrapper': 30, 'velveeta': 30, 'pasta shell': 30, 'gochugaru': 30, 'shellfish': 31, 'chestnut': 31, 'straw mushroom': 31, 'allspice berry': 31, 'soba': 31, 'waxy potato': 31, 'dried pinto bean': 31, 'baked tortilla chip': 31, 'green enchilada sauce': 31, 'gorgonzola': 31, 'cocktail cherry': 31, 'rotelle': 31, 'frond': 31, 'syrup': 31, 'cassava': 32, 'green tea': 32, 'food colouring': 32, 'serrano': 32, 'extra large egg': 32, 'golden delicious apple': 32, 'mexican chocolate': 32, 'raw cashew': 32, 'pie shell': 32, 'pickle relish': 32, 'chow mein noodle': 32, 'chayotes': 32, 'madeira': 33, 'mixed spice': 33, 'orzo pasta': 33, 'mexican chorizo': 33, 'salted roast peanut': 33, 'fresh red chili': 33, 'asafoetida powder': 33, 'poblano chilies': 33, 'baby lima bean': 33, 'gram flour': 33, 'cornichons': 33, 'spanish paprika': 33, 'rolled oat': 33, 'whitefish': 33, 'cherry brandy': 34, 'vine ripened tomato': 34, 'chees fresco queso': 34, 'dried dillweed': 34, 'filet': 34, 'soup': 34, 'sea bass fillet': 34, 'triple sec': 35, 'refrigerated pizza dough': 35, 'canola': 35, 'heirloom tomato': 35, 'galanga': 36, 'safflower oil': 36, 'crema': 36, 'sun dried tomato oil': 36, 'pickle': 36, 'fresh pea': 36, 'madras curry powder': 36, 'unsweetened chocolate': 36, 'fermented black bean': 36, 'hot chili sauce': 36, 'oxtail': 36, 'dried black bean': 36, 'phyllo pastry': 36, 'pepperoni slice': 36, 'flower': 37, 'bartlett pear': 37, 'apple brandy': 37, 'naan': 37, 'chinese chive': 37, 'graham cracker crumb': 37, 'crumbled gorgonzola': 37, 'mini marshmallow': 37, 'base': 37, 'hungarian sweet paprika': 37, 'hellmann best food real mayonnais': 37, 'roasted cashew': 37, 'black tea': 38, 'frankfurter': 38, 'plantain': 38, 'saltine': 38, 'cracker': 38, 'gai lan': 38, 'self rising cornmeal': 38, 'bonito flake': 38, 'fillet red snapper': 38, 'neutral oil': 38, 'white chocolate': 38, 'salted peanut': 38, 'glass noodle': 39, 'chile sauce': 39, 'dry vermouth': 39, 'toasted almond': 39, 'whipped topping': 39, 'toasted pine nut': 39, 'fresh blueberry': 39, 'chile de arbol': 39, 'jaggery': 40, 'vermicelli': 40, 'sprinkle': 40, 'caviar': 41, 'gnocchi': 41, 'crouton': 41, 'dark chocolate': 41, 'liqueur': 41, 'pitted green olive': 41, 'harissa': 42, 'chipotle chile powder': 42, 'dried bonito flake': 42, 'simple syrup': 42, 'shell': 42, 'ton wrapper': 42, 'quince': 43, 'epazote': 43, 'slaw mix': 43, 'greek seasoning': 43, 'orecchiette': 43, 'vinaigrette': 43, 'kumquat': 44, 'gruyere cheese': 44, 'cacao': 44, 'pizza crust': 44, 'ra el hanout': 44, 'silken tofu': 44, 'floret': 44, 'asafetida': 44, 'jumbo pasta shell': 44, 'cake': 44, 'chocolate': 44, 'french baguette': 44, 'club soda': 45, 'chile paste': 45, 'oven ready lasagna noodle': 45, 'flour dusting': 45, 'chaat masala': 45, 'new potato': 45, 'dried lentil': 45, 'sour milk': 46, 'rib eye steak': 46, 'green curry paste': 46, 'dried chile': 46, 'roast red pepper drain': 46, 'scotch bonnet chile': 46, 'pastry': 46, 'udon': 47, 'chopped almond': 47, 'baby arugula': 47, 'pita': 47, 'miso': 47, 'ground chuck': 47, 'ladyfinger': 47, 'pitted black olive': 47, 'soft tofu': 47, 'diced red onion': 47, 'enokitake': 47, 'hot italian sausage': 48, 'alfredo sauce': 48, 'bone oil': 49, 'katsuobushi': 49, 'port wine': 49, 'duck': 49, 'frozen spinach': 49, 'tapioca flour': 49, 'ground round': 49, 'rocket leaf': 49, 'file powder': 49, 'salad green': 49, 'great northern bean': 50, 'turbinado': 50, 'thai green curry paste': 50, 'capsicum': 50, 'gari': 50, 'nonstick spray': 50, 'crushed ice': 50, 'wild mushroom': 50, 'ground almond': 50, 'spanish chorizo': 50, 'rutabaga': 51, 'chicken liver': 51, 'dried cranberry': 51, 'yellow pepper': 51, 'puff pastry': 51, 'kasuri methi': 51, 'edamame': 51, 'anaheim chile': 51, 'artichok heart marin': 51, 'pepperoni': 52, 'fresh herb': 52, 'sambal ulek': 52, 'anchovy': 52, 'mung bean': 53, 'haricot verts': 53, 'chutney': 53, 'chip': 53, 'japanese eggplant': 53, 'fusilli': 53, 'juniper berry': 54, 'salami': 54, 'hamburger bun': 54, 'guajillo chile': 54, 'biscuit': 55, 'teriyaki sauce': 55, 'firmly packed light brown sugar': 55, 'octopus': 56, 'picante sauce': 56, 'salad oil': 56, 'haddock': 57, 'matsutake': 57, 'mackerel': 57, 'fresh leav spinach': 57, 'roasted tomato': 57, 'chopped green chilies': 58, 'unsalted dry roast peanut': 58, 'radicchio': 58, 'spring roll wrapper': 58, 'navel orange': 58, 'beaten egg': 58, 'rib': 59, 'dipping sauce': 59, 'sausage link': 59, 'semolina flour': 59, 'semolina': 60, 'liquid': 60, 'bird chile': 60, 'ramen noodle': 60, 'white mushroom': 60, 'escarole': 60, 'rotini': 60, 'pie crust': 60, 'instant espresso powder': 61, 'salad': 61, 'light mayonnaise': 61, 'prune': 61, 'roasting chicken': 61, 'sour cherry': 62, 'tahini': 62, 'poultry seasoning': 62, 'mashed potato': 62, 'littleneck clam': 62, 'taco sauce': 63, 'dressing': 63, 'mixed green': 63, 'taco shell': 63, 'steak': 64, 'coarse kosher salt': 64, 'crimini mushroom': 64, 'dry roasted peanut': 64, 'potato chip': 65, 'red enchilada sauce': 65, 'rigatoni': 65, 'ground sirloin': 65, 'halibut fillet': 65, 'herbes de provence': 65, 'nira': 66, 'chuck roast': 66, 'konbu': 66, 'italian salad dressing': 66, 'chuck': 67, 'chipotle pepper': 67, 'curd': 67, 'phyllo dough': 67, 'anchovy paste': 67, 'curry': 68, 'urad dal': 68, 'chorizo': 68, 'soba noodle': 68, 'coarse sea salt': 68, 'wood': 69, 'white hominy': 69, 'salad dressing': 69, 'fresh curry leaf': 69, 'masala': 69, 'sirloin steak': 69, 'chunky salsa': 70, 'cachaca': 70, 'poppy seed': 70, 'refrigerated piecrusts': 71, 'white miso': 71, 'red food coloring': 71, 'black sesame seed': 72, 'baby carrot': 72, 'spinach leaf': 72, 'skirt steak': 73, 'ranch dressing': 73, 'peeled tomato': 73, 'miso paste': 73, 'superfine sugar': 73, 'tilapia fillet': 73, 'asafoetida': 73, 'vodka': 74, 'nectarine': 75, 'canned tomato': 75, 'oatmeal': 76, 'white sesame seed': 76, 'whole clove': 76, 'chees fresh mozzarella': 76, 'hominy': 77, 'semi sweet chocolate morsel': 77, 'tangerine': 78, 'ancho powder': 78, 'fillet': 78, 'sweet italian sausage': 78, 'canned black bean': 79, 'pico de gallo': 79, 'grapeseed oil': 79, 'crabmeat': 79, 'white bean': 79, 'table salt': 79, 'liver': 80, 'pizza sauce': 80, 'marinade': 81, 'agave nectar': 81, 'serrano chilies': 81, 'lavender': 82, 'wheat bread': 83, 'bitter orange': 83, 'golden brown sugar': 83, 'panko': 83, 'chervil': 84, 'anise seed': 84, 'gin': 85, 'white cornmeal': 85, 'asiago': 85, 'galangal': 85, 'pearl onion': 85, 'quickcooking grit': 86, 'baby bok choy': 86, 'thai pepper': 87, 'herb': 87, 'amchur': 87, 'jicama': 88, 'roll': 88, 'root': 89, 'stock': 90, 'star anise': 91, 'rye bread': 91, 'orzo': 91, 'angel hair': 91, 'fat': 92, 'fresh raspberry': 92, 'firmly packed brown sugar': 92, 'ripe olive': 92, 'blanched almond': 93, 'adobo sauce': 94, 'dried currant': 95, 'malt': 96, 'green': 96, 'nori': 96, 'smoked salmon': 97, 'broth': 97, 'fresh mozzarella': 97, 'champagne wine': 99, 'boiling potato': 99, 'lime peel oil': 100, 'masa harina': 100, 'sliced carrot': 100, 'rose': 101, 'red bean': 101, 'truffle': 103, 'cornflour': 103, 'chorizo sausage': 103, 'baby spinach leaf': 103, 'swiss chard': 103, 'dried red chile pepper': 103, 'bow tie pasta': 103, 'serrano pepper': 104, 'sunflower oil': 105, 'ricotta': 105, 'dough': 105, 'freshly grated parmesan': 105, 'papaya': 106, 'enokidake': 106, 'molasses': 106, 'frozen pastry puff sheet': 106, 'curry paste': 106, 'diced green chilies': 106, 'green tomato': 108, 'sausage casing': 108, 'brassica': 109, 'chili oil': 109, 'red lentil': 110, 'paneer': 110, 'popcorn': 111, 'ice': 111, 'kimchi': 112, 'sweet chili sauce': 112, 'macadamia nut': 113, 'fresh chive': 113, 'penne': 113, 'buckwheat': 114, 'sea scallop': 114, 'quinoa': 116, 'pizza dough': 117, 'crawfish': 118, 'pesto': 118, 'poblano pepper': 119, 'granny smith apple': 119, 'gingerroot': 119, 'bok choy': 119, 'chile powder': 120, 'chilli': 121, 'red curry paste': 122, 'chili paste': 122, 'roasted pork': 125, 'brussels sprout': 126, 'barbecue sauce': 126, 'whole peeled tomato': 127, 'thai red curry paste': 127, 'chopped walnut': 128, 'dashi': 128, 'allspice': 129, 'ice cube': 130, 'caster sugar': 130, 'seasoning salt': 131, 'yam': 134, 'sweet paprika': 134, 'salsa verde': 135, 'rye flour': 136, 'tofu': 136, 'seasoning': 137, 'extra firm tofu': 137, 'italian sausage': 137, 'bamboo shoot': 137, 'cremini mushroom': 138, 'cotija': 139, 'bittersweet chocolate': 140, 'kiwi': 141, 'queso fresco': 141, 'lovage': 142, 'gochujang base': 142, 'szechwan peppercorn': 142, 'panko breadcrumb': 144, 'peppercorn': 144, 'crme frache': 145, 'savory': 147, 'chili sauce': 147, 'garbanzo bean': 148, 'fresh tomato': 148, 'polenta': 148, 'mascarpone': 149, 'peppermint': 150, 'chipotle chile': 150, 'daikon': 150, 'prawn': 151, 'red kidney bean': 154, 'plain flour': 154, 'chicory': 155, 'poblano chile': 155, 'watermelon': 156, 'bourbon whiskey': 156, 'shredded carrot': 156, 'chili flake': 158, 'wonton wrapper': 158, 'fettucine': 159, 'cognac': 160, 'chinese cabbage': 161, 'sliced black olive': 161, 'sun dried tomato': 161, 'corn grit': 162, 'endive': 163, 'button mushroom': 163, 'semisweet chocolate': 164, 'ice water': 164, 'provolone cheese': 167, 'collard green': 167, 'slivered almond': 167, 'jasmine': 171, 'spice': 171, 'pinto bean': 171, 'citrus': 173, 'stewed tomato': 175, 'grapefruit': 177, 'arugula': 177, 'pancetta': 177, 'green olive': 177, 'penne pasta': 178, 'cake flour': 179, 'purpose unbleached flour': 179, 'lima bean': 181, 'taco seasoning mix': 181, 'snow pea': 183, 'grit': 184, 'sausage': 185, 'guacamole': 185, 'chili': 187, 'sliced almond': 187, 'couscous': 189, 'anchovy fillet': 189, 'rhubarb': 192, 'lobster': 193, 'melon': 193, 'self rising flour': 193, 'chipotle adobo': 193, 'palm': 195, 'water chestnut': 195, 'mace': 196, 'catfish': 196, 'black eyed pea': 196, 'kalamata': 196, 'wasabi': 197, 'kelp': 202, 'cannellini bean': 203, 'pitted kalamata olive': 204, 'fig': 205, 'frozen chopped spinach': 206, 'parsnip': 207, 'baking potato': 207, 'firm tofu': 207, 'lasagna noodle': 209, 'peanut oil': 210, 'green pea': 212, 'sauerkraut': 213, 'cereal': 218, 'yukon gold potato': 218, 'berry': 219, 'curry leaf': 219, 'porcini': 220, 'margarine': 220, 'red chili powder': 220, 'roasted beef': 222, 'tortilla': 222, 'thai chile': 223, 'corn flake': 225, 'noodle': 225, 'chopped fresh chive': 227, 'rom tomato': 227, 'black olive': 229, 'marinara sauce': 229, 'shortening': 229, 'fresh spinach': 230, 'monterey jack': 235, 'roasted red pepper': 239, 'golden raisin': 240, 'diced onion': 242, 'watercress': 244, 'sliced mushroom': 244, 'seaweed': 246, 'yoghurt': 247, 'linguine': 248, 'refried bean': 250, 'chinese five spice powder': 253, 'baby spinach': 257, 'flank steak': 258, 'goat cheese': 259, 'tomato juice': 262, 'pasta sauce': 266, 'russet potato': 266, 'andouille sausage': 267, 'blackberry': 268, 'baguette': 270, 'taco seasoning': 271, 'fresh mushroom': 272, 'romano cheese': 275, 'creole seasoning': 276, 'juice': 280, 'chopped pecan': 282, 'cod': 284, 'prosciutto': 284, 'barley': 285, 'fine sea salt': 285, 'toasted sesame seed': 294, 'enchilada sauce': 295, 'tequila': 298, 'chopped tomato': 298, 'sriracha': 298, 'serrano chile': 299, 'currant': 300, 'kale': 300, 'tortilla chip': 302, 'green chile': 302, 'scallop': 306, 'ghee': 307, 'egg noodle': 308, 'pistachio': 310, 'tea': 310, 'squid': 314, 'cured pork': 314, 'caraway': 316, 'dark brown sugar': 319, 'mandarin': 320, 'roasted peanut': 321, 'pasta': 321, 'chile': 321, 'tomatillo': 322, 'turnip': 326, 'brown rice': 337, 'half half': 337, 'mussel': 338, 'green bean': 341, 'spaghetti': 342, 'beet': 345, 'smoked paprika': 345, 'cottage cheese': 348, 'pinenuts': 348, 'boiling water': 350, 'hot water': 356, 'lentil': 363, 'ground allspice': 364, 'spinach': 366, 'cornmeal': 368, 'white bread': 370, 'ground clove': 371, 'cajun seasoning': 376, 'frozen pea': 383, 'veal': 391, 'blue cheese': 395, 'confectioner sugar': 395, 'italian seasoning': 395, 'spring onion': 407, 'hazelnut': 411, 'smoked sausage': 415, 'whiskey': 420, 'light brown sugar': 422, 'hoisin sauce': 429, 'okra': 432, 'cashew': 432, 'ketchup': 432, 'crushed tomato': 453, 'black peppercorn': 453, 'beansprouts': 454, 'sauce': 458, 'pimento': 464, 'sliced green onion': 472, 'cooking oil': 483, 'smoke': 492, 'blueberry': 498, 'lemongrass': 501, 'powdered sugar': 501, 'eggplant': 501, 'mirin': 503, 'cold water': 506, 'date': 507, 'horseradish': 521, 'swiss cheese': 522, 'caper': 541, 'brandy': 566, 'orange peel': 572, 'warm water': 577, 'coarse salt': 578, 'beer': 600, 'kidney bean': 601, 'maple syrup': 606, 'fruit': 607, 'anise': 618, 'artichoke': 619, 'roasted sesame seed': 620, 'feta cheese': 621, 'clove': 630, 'cauliflower': 631, 'tuna': 632, 'pear': 635, 'red chili pepper': 644, 'grape': 652, 'hot sauce': 674, 'worcestershire sauce': 688, 'curry powder': 694, 'marjoram': 696, 'clam': 699, 'lemon peel': 715, 'tarragon': 721, 'saffron': 723, 'whole grain wheat flour': 732, 'mango': 737, 'tumeric': 738, 'salmon': 752, 'green chilies': 768, 'mayonaise': 781, 'crab': 783, 'asparagus': 786, 'grape juice': 811, 'radish': 818, 'beef broth': 835, 'rum': 841, 'granulated sugar': 849, 'leek': 850, 'chickpea': 857, 'flour tortilla': 865, 'peach': 866, 'apricot': 875, 'oyster': 915, 'raspberry': 925, 'garam masala': 925, 'sea salt': 940, 'baking soda': 942, 'milk fat': 947, 'coffee': 954, 'salsa': 963, 'tabasco pepper': 965, 'sake': 969, 'sweet potato': 973, 'cranberry': 977, 'pumpkin': 994, 'celery oil': 994, 'peanut butter': 995, 'squash': 1000, 'fenugreek': 1039, 'lamb': 1064, 'soybean': 1069, 'white sugar': 1093, 'cardamom': 1115, 'shiitake': 1125, 'canola oil': 1223, 'sherry': 1246, 'meat': 1254, 'nut': 1260, 'plum': 1269, 'paprika': 1287, 'mozzarella cheese': 1290, 'oat': 1292, 'banana': 1296, 'strawberry': 1318, 'leaf': 1322, 'sesame seed': 1331, 'flour': 1348, 'pork sausage': 1362, 'black bean': 1370, 'sage': 1375, 'red wine': 1393, 'broccoli': 1417, 'pea': 1424, 'lime juice': 1427, 'seed': 1459, 'cider': 1479, 'cooking spray': 1490, 'brown sugar': 1503, 'turkey': 1520, 'chive': 1522, 'dill': 1552, 'gelatin': 1556, 'fennel': 1565, 'cherry': 1618, 'diced tomato': 1624, 'orange juice': 1700, 'jalapeno chilies': 1730, 'baking powder': 1738, 'peanut': 1793, 'tamarind': 1868, 'avocado': 1949, 'ham': 1964, 'oil': 1970, 'pineapple': 1984, 'zucchini': 2024, 'chili powder': 2036, 'yogurt': 2127, 'white wine': 2166, 'cabbage': 2191, 'turmeric': 2198, 'lettuce': 2241, 'mint': 2260, 'raisin': 2367, 'pecan': 2461, 'bean': 2496, 'green bell pepper': 2578, 'buttermilk': 2641, 'starch': 2656, 'shallot': 2664, 'rosemary': 2748, 'almond': 2837, 'cream cheese': 2839, 'walnut': 2909, 'cucumber': 2936, 'large egg': 2948, 'apple': 3009, 'cheddar cheese': 3029, 'green onion': 3078, 'kosher salt': 3113, 'parmesan cheese': 3167, 'macaroni': 3202, 'lard': 3209, 'bacon': 3357, 'chicken broth': 3454, 'orange': 3464, 'bay': 3567, 'nutmeg': 3588, 'sesame oil': 3675, 'coriander': 3688, 'fish': 3703, 'honey': 3873, 'shrimp': 3907, 'coconut': 3918, 'mushroom': 4042, 'yeast': 4149, 'pork': 4429, 'purpose flour': 4632, 'wine': 4709, 'potato': 4984, 'lemon juice': 5033, 'cocoa': 5194, 'thyme': 5512, 'celery': 5719, 'bell pepper': 5847, 'mustard': 5866, 'oregano': 5931, 'lime': 6012, 'scallion': 6294, 'carrot': 6433, 'sugar': 6434, 'bread': 6760, 'basil': 6858, 'water': 7456, 'vegetable': 7504, 'cane molasses': 7655, 'cumin': 7863, 'beef': 7903, 'soy sauce': 8040, 'cilantro': 8199, 'cinnamon': 8215, 'parsley': 8611, 'lemon': 8842, 'ginger': 9204, 'rice': 9303, 'vinegar': 9325, 'black pepper': 9752, 'olive oil': 9844, 'corn': 10015, 'cayenne': 10090, 'vegetable oil': 10759, 'vanilla': 11249, 'olive': 12835, 'cheese': 14124, 'tomato': 15572, 'cream': 16045, 'chicken': 16595, 'milk': 17446, 'salt': 18049, 'wheat': 21438, 'egg': 26875, 'butter': 29043, 'onion': 32893, 'pepper': 32979, 'garlic': 35804}
6434

Top 5 Most Similar Ingredients

In [10]:
# Top 5 most similar ingredients to each one present in Recipe1M+ and K&N.

ingredient_top5SimilarIngredients = {}

for ingredient in model.wv.vocab:
    
    ingredient_top5SimilarIngredients[ingredient] = model.similar_by_word(ingredient, topn=5, restrict_vocab=None)
In [10]:
with open('./data/Recipe1M+/ingredient_top5SimilarIngredients.json', 'w') as json_file:
    json.dump(ingredient_top5SimilarIngredients, json_file)
/Users/luisrita/PycharmProjects/HyperFoods/venv/lib/python3.6/site-packages/ipykernel_launcher.py:5: DeprecationWarning:

Call to deprecated `similar_by_word` (Method will be removed in 4.0.0, use self.wv.similar_by_word() instead).

Cuisines Distribution

In [11]:
# Calculating cuisine distribution in Recipe1M+ (considering only recipes with keyword "tea"/"salad" in the title).

with open('./data/Recipe1M+/predictedCuisines.json') as data_file:
    
    predictedCuisines = ast.literal_eval(data_file.read())

cuisines = {}

for idd in list(id_tea.keys()): # id_salad in the case of considering keyword "salad"
    
    if idd in list(predictedCuisines.keys()) and predictedCuisines[idd] in list(cuisines.keys()):
    
        cuisines[predictedCuisines[idd]] = cuisines[predictedCuisines[idd]] + 1
        
    elif idd in list(predictedCuisines.keys()):
        
        cuisines[predictedCuisines[idd]] = 0
    
print(cuisines)
{'NorthAmerican': 526, 'EastAsian': 1140, 'WesternEuropean': 248, 'LatinAmerican': 123, 'NorthernEuropean': 1073, 'MiddleEastern': 49, 'African': 338, 'SouthAsian': 209, 'SoutheastAsian': 222, 'SouthernEuropean': 228, 'EasternEuropean': 56}